⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 futucompetedlg.cpp

📁 考虑未来竞争的空间交互选址问题求解
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	for(i=0; i<m_nmRequireNum; i++)
	{
		son = 4*UseUV[i]*UseXY[i];
		son *= (u - XYReq[i].x)*(y - XYReq[i].y);
		son *= ((2*m_dL[i] - m_dE[i])*DistUV22[i] + UseUV[i]);
		mth = pow(m_dE[i]*DistUV22[i] + UseUV[i], 3.0);
		mth *= pow(DistXY22[i], 2.0);
		EQ2_uy_temp += RequireQuantum[i]*son/mth;
	}

	return EQ2_uy_temp;
	
}

double CFutuCompeteDlg::P2EQ2_PvPx(double v, double x)
{
	int i;
	double EQ2_vx_temp = 0.0;
	double son, mth;
	
	for(i=0; i<m_nmRequireNum; i++)
	{
		son = 4*UseUV[i]*UseXY[i];
		son *= (v - XYReq[i].y)*(x - XYReq[i].x);
		son *= ((2*m_dL[i] - m_dE[i])*DistUV22[i] + UseUV[i]);
		mth = pow(m_dE[i]*DistUV22[i] + UseUV[i], 3.0);
		mth *= pow(DistXY22[i], 2.0);
		EQ2_vx_temp += RequireQuantum[i]*son/mth;
	}

	return EQ2_vx_temp;
}


double CFutuCompeteDlg::P2EQ2_PvPy(double v, double y)
{
	int i;
	double EQ2_vy_temp = 0.0;
	double son, mth;
	
	for(i=0; i<m_nmRequireNum; i++)
	{
		son = 4*UseUV[i]*UseXY[i];
		son *= (v - XYReq[i].y)*(y - XYReq[i].y);
		son *= ((2*m_dL[i] - m_dE[i])*DistUV22[i] + UseUV[i]);
		mth = pow(m_dE[i]*DistUV22[i] + UseUV[i], 3.0);
		mth *= pow(DistXY22[i], 2.0);
		EQ2_vy_temp += RequireQuantum[i]*son/mth;
	}

	return EQ2_vy_temp;	
}

double CFutuCompeteDlg::P2EQ2_PuPu(double u)
{
	int i;
	double EQ2_uu_temp = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = 2 * UseUV[i] * (m_dL[i] - m_dE[i]);
		son *= m_dE[i] * DistUV22[i] + UseUV[i] -4*m_dE[i]*pow(u-XYReq[i].x, 2.0);
		mth *= pow(m_dE[i] * DistUV22[i] + UseUV[i], 3.0);
		EQ2_uu_temp += RequireQuantum[i]*son/mth;
	}

	return EQ2_uu_temp;

}

double CFutuCompeteDlg::P2EQ2_PvPv(double v)
{
	int i;
	double EQ2_vv_temp = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = 2 * UseUV[i] * (m_dL[i] - m_dE[i]);
		son *= m_dE[i] * DistUV22[i] + UseUV[i] -4*m_dE[i]*pow(v - XYReq[i].y, 2.0);
		mth = pow(m_dE[i] * DistUV22[i] + UseUV[i], 3.0);
		EQ2_vv_temp += RequireQuantum[i]*son/mth;
	}
	
	return EQ2_vv_temp;

}

double CFutuCompeteDlg::P2EQ2_PuPv(double u, double v)
{
	int i;
	double EQ2_uv_temp = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = -8 * UseUV[i] * m_dE[i] * (m_dL[i] - m_dE[i]);
		son *= (u - XYReq[i].x) * (v - XYReq[i].y);
		mth = pow(m_dE[i]*DistUV22[i] + UseUV[i], 3.0);
		EQ2_uv_temp += RequireQuantum[i]*son/mth;
	}

	return EQ2_uv_temp;
}

double CFutuCompeteDlg::P1EQ1_Py(double y)
{
	int i;
	double EQ1_y_temp = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = m_dN[i] + UseUV[i]/DistUV22[i];
		son *= (-2*UseXY[i] * (y - XYReq[i].y));
		mth = pow(m_dD[i]*DistXY22[i] + UseXY[i], 2.0);
		EQ1_y_temp += RequireQuantum[i]*son/mth;
	}

	return EQ1_y_temp;
}

/*
double CFutuCompeteDlg::P2EQ1_PuPy(double u, double y)
{
	int i;
	double EQ2_uy_temp = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = 4*UseUV[i]*UseXY[i];
		son *= (u - XYReq[i].x)*(y - XYReq[i].y);
		son *= ((2*m_dL[i] - m_dE[i])*DistUV22[i] + UseUV[i]);
		mth = pow(m_dE[i]*DistUV22[i] + UseUV[i], 3.0);
		mth *= DistXY22[i];
		EQ2_uy_temp += RequireQuantum[i]*son/mth;
	}
	
	return EQ2_uy_temp;
}

double CFutuCompeteDlg::P2EQ1_PvPy(double v, double y)
{
	int i;
	double EQ2_vy_temp = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = 4*UseUV[i]*UseXY[i];
		son *= (v - XYReq[i].y)*(y - XYReq[i].y);
		son *= ((2*m_dL[i] - m_dE[i])*DistUV22[i] + UseUV[i]);
		mth = pow(m_dE[i]*DistUV22[i] + UseUV[i], 3.0);
		mth *= DistXY22[i];
		EQ2_vy_temp += son/mth;
	}

	return EQ2_vy_temp;
}
*/

void CFutuCompeteDlg::getDeta(double u, double v, double x, double y)
{
	m_dDeta = P2EQ2_PuPu(u) * P2EQ2_PvPv(v) - pow(P2EQ2_PuPx(u,x), 2.0);
}

void CFutuCompeteDlg::getA(double u)
{
	m_dA = P2EQ2_PuPu(u)/m_dDeta;
}

void CFutuCompeteDlg::getB(double u, double v)
{
	m_dB = P2EQ2_PuPv(u,v)/m_dDeta;
}

void CFutuCompeteDlg::getC(double v)
{
	m_dA = P2EQ2_PvPv(v)/m_dDeta;
}

double CFutuCompeteDlg::D1EQ1_Dx(double x, double y, double u, double v)
{
	double dxtemp = 0.0;

	dxtemp = P1EQ1_Px(x) - P1EQ1_Pu(u) * (m_dC * P2EQ2_PuPx(u,x) - 
			 m_dB * P2EQ2_PvPx(v,x)) - P1EQ1_Pv(v) * (m_dA * P2EQ2_PvPx(v,x) - 
			 m_dB * P2EQ2_PuPx(u,x));

	return dxtemp;
}

double CFutuCompeteDlg::D1EQ1_Dy(double  x, double y, double u, double v)
{
	double dytemp = 0.0;

	dytemp = P1EQ1_Py(y) - P1EQ1_Pu(u) * (m_dC * P2EQ2_PuPy(u,y) 
			 - m_dB * P2EQ2_PvPy(v,y))- P1EQ1_Pv(v) * (m_dA * P2EQ2_PvPy(v,y) 
			 - m_dB * P2EQ2_PuPy(u,y));

	return dytemp;
}

double CFutuCompeteDlg::getEQ1(double x, double y, double u, double v)
{
	int i;
	double eq1temp = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = m_dM[i] + UseXY[i]/DistXY22[i];
		mth = m_dN[i] + m_dM[i] + UseUV[i]/DistUV22[i] + UseXY[i]/DistXY22[i];
		eq1temp += RequireQuantum[i]*son/mth;
	}

	return eq1temp;
}

double CFutuCompeteDlg::getEQ2(double x, double y, double u, double v)
{
	int i;
	double eq2temp = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = m_dL[i] + UseUV[i]/DistUV22[i];
		mth = m_dN[i] + m_dM[i] + UseUV[i]/DistUV22[i] + UseXY[i]/DistXY22[i];
		eq2temp += RequireQuantum[i]*son/mth;
	}
	
	return eq2temp;
}

/*
void CFutuCompeteDlg::getBoundsofX(double &left,  double &top, 
								  double &right, double &bottom)
{
	int i;
	left = right = XYReq[0].x;
	top  = right = XYReq[0].y;

	for(i=1; i<m_nmRequireNum; i++)
	{
		if(left > XYReq[i].x)
			left = XYReq[i].x;
		if(right < XYReq[i].x)
			right = XYReq[i].x;

		if(top > XYReq[i].y)
			top = XYReq[i].y;
		if(bottom < XYReq[i].y)
			bottom = XYReq[i].y;
	}

	for(i=1; i<m_nnCompeteNum; i++)
	{
		if(left > XYCom[i].x)
			left = XYCom[i].x;
		if(right < XYCom[i].x)
			right = XYCom[i].x;

		if(top > XYCom[i].y)
			top = XYCom[i].y;
		if(bottom < XYCom[i].y)
			bottom = XYCom[i].y;
	}
	
	for(i=1; i<m_ncExistOfANum; i++)
	{
		if(left > XYCom[i].x)
			left = XYCom[i].x;
		if(right < XYCom[i].x)
			right = XYCom[i].x;

		if(top > XYCom[i].y)
			top = XYCom[i].y;
		if(bottom < XYCom[i].y)
			bottom = XYCom[i].y;
	}
}
*/

void CFutuCompeteDlg::InitData()
{
	//给L、M、N、D、E赋初值
	setL();
	setM();
	setN();
}

void CFutuCompeteDlg::GetXYUVDist22(double x, double y,
									double u, double v)
{
	int i;
	for(i=0; i<m_nmRequireNum; i++)
	{
		DistXY22[i] = (x-XYReq[i].x)*(x-XYReq[i].x) + (y-XYReq[i].y)*(y-XYReq[i].y);
		DistUV22[i] = (u-XYReq[i].x)*(u-XYReq[i].x) + (v-XYReq[i].y)*(v-XYReq[i].y);
	}
}

// 当X、V变化时,D、E、DistXY22、DistUV22会发生变化,所以此时需要更新数据
void CFutuCompeteDlg::refreshData(double x, double y, double u, double v)
{
	int i;
	for(i=0; i<m_nmRequireNum; i++)
	{
		DistXY22[i] = (x-XYReq[i].x)*(x-XYReq[i].x) +  (y-XYReq[i].y)*(y-XYReq[i].y);
		DistUV22[i] = (u-XYReq[i].x)*(u-XYReq[i].x) +  (v-XYReq[i].y)*(v-XYReq[i].y);
	}
	setD();
	setE();
}

// d(EQ1())/d(r) (r在此代表nubra)
double CFutuCompeteDlg::dEQ1_dNubra(double x, double y, 
									double u, double v, 
									double a, double b)
{
	int i;
	double dEQ1dnubra = 0.0;
	double son, mth;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son = (a*(x - XYReq[i].x) + b*(y - XYReq[i].y)) * (m_dM[i] - m_dD[i]);
		son *= 2 * RequireQuantum[i] * UseXY[i];
		mth = pow(m_dD[i]*DistXY22[i] + UseXY[i], 2.0);
		dEQ1dnubra += son/mth;
	}
	
	if (dEQ1dnubra<0.0)
	{
		dEQ1dnubra *= -1;
	}

	return dEQ1dnubra;
}

double CFutuCompeteDlg::Get_Nubra(double x, double y, 
								  double u, double v,
								  double a, double b)
{
	int i;
	double nubraValue;
	double son = 0.0, mth = 0.0;
	double son1, mth1;
	double son2, mth2;

	for(i=0; i<m_nmRequireNum; i++)
	{
		son1 = (a*(x - XYReq[i].x) + b*(y - XYReq[i].y)) * (m_dM[i] - m_dD[i]);
		son1 *= 2 * RequireQuantum[i] * UseXY[i];
		mth1 = pow( m_dD[i]*DistXY22[i] + UseXY[i], 2.0 );
		son += son1/mth1;

		son2 = 2*(a*a + b*b) * UseXY[i];
		son2 *= m_dN[i] + UseUV[i]/DistUV22[i];
		son2 *= RequireQuantum[i];
		mth2 = mth1;
		mth += son2/mth2;
	}
	nubraValue = son/mth;

	return nubraValue;
}

void CFutuCompeteDlg::OnButtonCompute() 
{
	CoordXY X0, Xcur, Xend, Xtemp, V;
	double  diffAbsValue; // X-X'的绝对值
	double  dEQ1dx, dEQ1dy;	
	double  dEQ1dnubra=1.0;
	double  nubra=0;
	
	CString str, str1;
	m_ctrlRequireNum.GetWindowText(str);
		m_nmRequireNum = atoi(str);
	m_ctrlCompeteNum.GetWindowText(str);
		m_nnCompeteNum = atoi(str);
	m_ctrlCompOfBNum.GetWindowText(str);
		m_nlCompOfBNum = atoi(str);
	m_ctrlExistOfANum.GetWindowText(str);
		m_ncExistOfANum = atoi(str);

	GetRequireQuantum();
	GetXYofAllPoints();
	GetDistance22();
	GetUseToRequire();
	GetCoeOfDistance();

	InitData();
	X0 = GetInitX(); // 获得初值X

	for(int i=0; i<m_nmRequireNum; i++)
	{
		DistXY22[i] = (X0.x-XYReq[i].x)*(X0.x-XYReq[i].x) + 
					  (X0.y-XYReq[i].y)*(X0.y-XYReq[i].y);
		double di = DistXY22[i];
	}
	Xcur.x = X0.x;
	Xcur.y = X0.y;
	double x = Xcur.x;
	double y = Xcur.y;
	
	do 
	{
		dEQ1dnubra = 1.0;
		
		V = GetVFromX(Xcur);// 由Xcur得到V

		GetXYUVDist22(Xcur.x, Xcur.y, V.x, V.y);
		setD();
		setE();

		getDeta(V.x, V.y, Xcur.x, Xcur.y);
		getA(V.x);
		getB(V.x, V.y);
		getC(V.y);

		// 获得d(EQ1(X,V))/dx ,d(EQ1(X,V))/dy
		dEQ1dx = D1EQ1_Dx(Xcur.x, Xcur.y, V.x, V.y);
		dEQ1dy = D1EQ1_Dy(Xcur.x, Xcur.y, V.x, V.y);
		
		while( dEQ1dnubra > 0.001)
		{
			Xtemp.x = Xcur.x;
			Xtemp.y = Xcur.y;

			dEQ1dnubra = dEQ1_dNubra(Xcur.x, Xcur.y, V.x, V.y, dEQ1dx, dEQ1dy);
			
			nubra = Get_Nubra(Xcur.x, Xcur.y, V.x, V.y, dEQ1dx, dEQ1dy);
			
			Xend.x = Xtemp.x + nubra * dEQ1dx;
			Xend.y = Xtemp.y + nubra * dEQ1dy;
			V = GetVFromX(Xend);
			Xcur.x = Xend.x;	
			Xcur.y = Xend.y;	
			refreshData(Xend.x, Xend.y, V.x, V.y);
		}

		diffAbsValue = pow(pow((Xend.x-Xtemp.x),2.0) + pow((Xend.y-Xtemp.y),2.0), 0.5);
		Xcur.x = Xend.x;
		Xcur.y = Xend.y;
	}
	while (diffAbsValue >= ABS_LIMITED);

	Result_XY.x = Xend.x;
	Result_XY.y = Xend.y;
	Result_UV.x = V.x;
	Result_UV.y = V.y;
	Result_MAXEQ1 = getEQ1(Result_XY.x, Result_XY.y, Result_UV.x, Result_UV.y);
	Result_MAXEQ2 = getEQ2(Result_XY.x, Result_XY.y, Result_UV.x, Result_UV.y);

	str.Format("%f,", Result_XY.x);
	str1.Format("%f", Result_XY.y);
	str += str1;
	m_ctrlXY.SetWindowText(str);

	//str.Format("%f", Result_UV);
	str.Format("%f,", Result_UV.x);
	str1.Format("%f", Result_UV.y);
	str += str1;
	m_ctrlUV.SetWindowText(str);

	str.Format("%f", Result_MAXEQ1);
	m_ctrlEQ1.SetWindowText(str);

	str.Format("%f", Result_MAXEQ2);
	m_ctrlEQ2.SetWindowText(str);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -