📄 futucompetedlg.cpp
字号:
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 + -