?? interpolaterdlg.cpp
字號:
CString s;
s.Format("f(%f) = %f\r\n", t[i], yt);
m_strTargetYi += s;
}
AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);
// 釋放內(nèi)存
delete[] dy;
delete[] t;
delete[] x;
delete[] y;
}
/*
10
0.1
0.1
0.904837,0.818731,0.740818,0.670320,0.606531,0.548812,0.496585,0.449329,0.406570,0.367879
1
0.752
*/
// 埃爾米特等距插值
void CInterpolaterDlg::OnButton8()
{
// 獲取數(shù)據(jù)
UpdateData();
double x0;
double *y = new double[m_nNumNodes];
CInterpolate::GetNodesFromString(m_strXi, 1, &x0, ",");
CInterpolate::GetNodesFromString(m_strYi, m_nNumNodes, y, ",");
double *dy = new double[m_nNumNodes];
for (int i=0; i<m_nNumNodes; ++i)
dy[i]=-y[i];
// 插值運算
double *t = new double[m_nNumTargetNodes];
CInterpolate::GetNodesFromString(m_strTargetXi, m_nNumTargetNodes, t, ",");
// 顯示結(jié)果
double dblStep = atof(m_strStepOrBorderCondition);
m_strTargetYi = "";
for (i=0; i<m_nNumTargetNodes; ++i)
{
double yt = CInterpolate::GetValueHermite(m_nNumNodes, x0, dblStep, y, dy, t[i]);
CString s;
s.Format("f(%f) = %f\r\n", t[i], yt);
m_strTargetYi += s;
}
AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);
// 釋放內(nèi)存
delete[] dy;
delete[] t;
delete[] y;
}
/*
10
-1.0,-0.8,-0.65,-0.4,-0.3,0.0,0.2,0.4,0.6,0.8,1.0
0.0384615,0.0588236,0.0864865,0.2,0.307692,1.0,0.5,0.2,0.1,0.0588236,0.0384615
2
-0.75,0.05
*/
// 埃特金不等距逐步插值
void CInterpolaterDlg::OnButton9()
{
// 獲取數(shù)據(jù)
UpdateData();
double *x = new double[m_nNumNodes];
double *y = new double[m_nNumNodes];
CInterpolate::GetNodesFromString(m_strXi, m_nNumNodes, x, ",");
CInterpolate::GetNodesFromString(m_strYi, m_nNumNodes, y, ",");
// 插值運算
double *t = new double[m_nNumTargetNodes];
CInterpolate::GetNodesFromString(m_strTargetXi, m_nNumTargetNodes, t, ",");
// 顯示結(jié)果
m_strTargetYi = "";
for (int i=0; i<m_nNumTargetNodes; ++i)
{
double yt = CInterpolate::GetValueAitken(m_nNumNodes, x, y, t[i]);
CString s;
s.Format("f(%f) = %f\r\n", t[i], yt);
m_strTargetYi += s;
}
AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);
// 釋放內(nèi)存
delete[] t;
delete[] x;
delete[] y;
}
/*
10
0.1
0.1
0.904837,0.818731,0.740818,0.670320,0.606531,0.548812,0.496585,0.449329,0.406570,0.367879
2
0.15,0.55
*/
// 埃特金等距逐步插值
void CInterpolaterDlg::OnButton10()
{
// 獲取數(shù)據(jù)
UpdateData();
double x0;
double *y = new double[m_nNumNodes];
CInterpolate::GetNodesFromString(m_strXi, 1, &x0, ",");
CInterpolate::GetNodesFromString(m_strYi, m_nNumNodes, y, ",");
// 插值運算
double *t = new double[m_nNumTargetNodes];
CInterpolate::GetNodesFromString(m_strTargetXi, m_nNumTargetNodes, t, ",");
// 顯示結(jié)果
double dblStep = atof(m_strStepOrBorderCondition);
m_strTargetYi = "";
for (int i=0; i<m_nNumTargetNodes; ++i)
{
double yt = CInterpolate::GetValueAitken(m_nNumNodes, x0, dblStep, y, t[i]);
CString s;
s.Format("f(%f) = %f\r\n", t[i], yt);
m_strTargetYi += s;
}
AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);
// 釋放內(nèi)存
delete[] t;
delete[] y;
}
/*
11
-1.0,-0.95,-0.75,-0.55,-0.3,0.0,0.2,0.45,0.6,0.8,1.0
0.0384615,0.0424403,0.06639,0.116788,0.307692,1.0,0.5,0.164948,0.1,0.0588236,0.0384615
2
-0.85,0.15
*/
// 光滑不等距插值
void CInterpolaterDlg::OnButton11()
{
// 獲取數(shù)據(jù)
UpdateData();
double *x = new double[m_nNumNodes];
double *y = new double[m_nNumNodes];
CInterpolate::GetNodesFromString(m_strXi, m_nNumNodes, x, ",");
CInterpolate::GetNodesFromString(m_strYi, m_nNumNodes, y, ",");
// 插值運算
double *t = new double[m_nNumTargetNodes];
CInterpolate::GetNodesFromString(m_strTargetXi, m_nNumTargetNodes, t, ",");
// 顯示結(jié)果
m_strTargetYi = "";
for (int i=0; i<m_nNumTargetNodes; ++i)
{
double dblCoef[5];
double yt = CInterpolate::GetValueAkima(m_nNumNodes, x, y, t[i], dblCoef);
CString s;
s.Format("f(%f) = %f\r\ns0 = %f s1 = %f s2 = %f s3 = %f\r\n\r\n",
t[i], yt, dblCoef[0], dblCoef[1], dblCoef[2], dblCoef[3]);
m_strTargetYi += s;
}
AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);
// 釋放內(nèi)存
delete[] t;
delete[] x;
delete[] y;
}
/*
11
0.2
-1.0
0.0384615,0.0588236,0.1,0.2,0.5,1.0,0.5,0.2,0.1,0.0588236,0.0384615
2
-0.65,0.25
*/
// 光滑等距插值
void CInterpolaterDlg::OnButton12()
{
// 獲取數(shù)據(jù)
UpdateData();
double x0;
double *y = new double[m_nNumNodes];
CInterpolate::GetNodesFromString(m_strXi, 1, &x0, ",");
CInterpolate::GetNodesFromString(m_strYi, m_nNumNodes, y, ",");
// 插值運算
double *t = new double[m_nNumTargetNodes];
CInterpolate::GetNodesFromString(m_strTargetXi, m_nNumTargetNodes, t, ",");
// 顯示結(jié)果
double dblStep = atof(m_strStepOrBorderCondition);
m_strTargetYi = "";
for (int i=0; i<m_nNumTargetNodes; ++i)
{
double dblCoef[5];
double yt = CInterpolate::GetValueAkima(m_nNumNodes, x0, dblStep, y, t[i], dblCoef);
CString s;
s.Format("f(%f) = %f\r\ns0 = %f s1 = %f s2 = %f s3 = %f\r\n\r\n",
t[i], yt, dblCoef[0], dblCoef[1], dblCoef[2], dblCoef[3]);
m_strTargetYi += s;
}
AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);
// 釋放內(nèi)存
delete[] t;
delete[] y;
}
/*
12
1.86548,-0.046115
0.52,8.0,17.95,28.65,50.65,104.6,156.6,260.7,364.4,468.0,507.0,520.0
5.28794,13.84,20.2,24.9,31.1,36.5,36.6,31.0,20.9,7.8,1.5,0.2
8
4.0,14.0,30.0,60.0,130.0,230.0,450.0,515.0
*/
// 第一種邊界條件的三次樣條函數(shù)插值、微商與積分
void CInterpolaterDlg::OnButton13()
{
// 獲取數(shù)據(jù)
UpdateData();
double *x = new double[m_nNumNodes];
double *y = new double[m_nNumNodes];
CInterpolate::GetNodesFromString(m_strXi, m_nNumNodes, x, ",");
CInterpolate::GetNodesFromString(m_strYi, m_nNumNodes, y, ",");
double *dy = new double[m_nNumNodes];
double *ddy = new double[m_nNumNodes];
double dblTmp[2];
CInterpolate::GetNodesFromString(m_strStepOrBorderCondition, 2, dblTmp, ",");
dy[0] = dblTmp[0];
dy[m_nNumNodes-1] = dblTmp[1];
// 插值運算
double *t = new double[m_nNumTargetNodes];
double *z = new double[m_nNumTargetNodes];
double *dz = new double[m_nNumTargetNodes];
double *ddz = new double[m_nNumTargetNodes];
CInterpolate::GetNodesFromString(m_strTargetXi, m_nNumTargetNodes, t, ",");
double yt = CInterpolate::GetValueSpline1(m_nNumNodes, x, y, dy, ddy, m_nNumTargetNodes, t, z, dz, ddz);
// 顯示結(jié)果
m_strTargetYi.Format("積分值 = %f\r\n\r\n", yt);
m_strTargetYi += " t[i]\t z[i]\t dz[i]\t ddz[i]\r\n";
for (int i=0; i<m_nNumTargetNodes; ++i)
{
CString s;
s.Format("%f %f %f %f\r\n", t[i], z[i], dz[i], ddz[i]);
m_strTargetYi += s;
}
AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);
// 釋放內(nèi)存
delete[] t;
delete[] x;
delete[] y;
delete[] dy;
delete[] ddy;
delete[] z;
delete[] dz;
delete[] ddz;
}
/*
12
-0.279319,0.011156
0.52,8.0,17.95,28.65,50.65,104.6,156.6,260.7,364.4,468.0,507.0,520.0
5.28794,13.84,20.2,24.9,31.1,36.5,36.6,31.0,20.9,7.8,1.5,0.2
8
4.0,14.0,30.0,60.0,130.0,230.0,450.0,515.0
*/
// 第二種邊界條件的三次樣條函數(shù)插值、微商與積分
void CInterpolaterDlg::OnButton14()
{
// 獲取數(shù)據(jù)
UpdateData();
double *x = new double[m_nNumNodes];
double *y = new double[m_nNumNodes];
CInterpolate::GetNodesFromString(m_strXi, m_nNumNodes, x, ",");
CInterpolate::GetNodesFromString(m_strYi, m_nNumNodes, y, ",");
double *dy = new double[m_nNumNodes];
double *ddy = new double[m_nNumNodes];
double dblTmp[2];
CInterpolate::GetNodesFromString(m_strStepOrBorderCondition, 2, dblTmp, ",");
ddy[0] = dblTmp[0];
ddy[m_nNumNodes-1] = dblTmp[1];
// 插值運算
double *t = new double[m_nNumTargetNodes];
double *z = new double[m_nNumTargetNodes];
double *dz = new double[m_nNumTargetNodes];
double *ddz = new double[m_nNumTargetNodes];
CInterpolate::GetNodesFromString(m_strTargetXi, m_nNumTargetNodes, t, ",");
double yt = CInterpolate::GetValueSpline2(m_nNumNodes, x, y, dy, ddy, m_nNumTargetNodes, t, z, dz, ddz);
// 顯示結(jié)果
m_strTargetYi.Format("積分值 = %f\r\n\r\n", yt);
m_strTargetYi += " t[i]\t z[i]\t dz[i]\t ddz[i]\r\n";
for (int i=0; i<m_nNumTargetNodes; ++i)
{
CString s;
s.Format("%f %f %f %f\r\n", t[i], z[i], dz[i], ddz[i]);
m_strTargetYi += s;
}
AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);
// 釋放內(nèi)存
delete[] t;
delete[] x;
delete[] y;
delete[] dy;
delete[] ddy;
delete[] z;
delete[] dz;
delete[] ddz;
}
/*
37
36
*/
// 第三種邊界條件的三次樣條函數(shù)插值、微商與積分
void CInterpolaterDlg::OnButton15()
{
// 獲取數(shù)據(jù)
UpdateData();
double x[37], y[37], dy[37], ddy[37];
double t[36], z[36], dz[36], ddz[36];
for (int i=0; i<37; ++i)
{
x[i]=i*6.2831852/36.0;
y[i]=sin(x[i]);
}
// 插值運算
for (i=0; i<36; ++i)
{
t[i]=(0.5+i)*6.2831852/36.0;
}
double yt = CInterpolate::GetValueSpline3(37, x, y, dy, ddy, 36, t, z, dz, ddz);
// 顯示結(jié)果
CString s, ss;
s.Format("積分值 = %f\r\n\r\n", yt);
ss.Format(" x(i) y(i)=sin(x) dy(i)=cos(x) ddy(i)=-sin(x)\r\n\r\n");
s += ss;
ss.Format("%6.1f%10.6f%11.6f%12.6f\r\n",x[0],y[0],dy[0],ddy[0]);
s += ss;
for (i=0; i<36; i++)
{
double u=t[i]*36.0/0.62831852;
ss.Format("%6.1f%10.6f%11.6f%12.6f\r\n",u,z[i],dz[i],ddz[i]);
s += ss;
u=x[i+1]*36.0/0.62831852;
int j=i+1;
ss.Format("%6.1f%10.6f%11.6f%12.6f\r\n",u,y[j],dy[j],ddy[j]);
s += ss;
}
CSpline3Dlg dlg;
dlg.m_strResult = s;
dlg.DoModal();
}
// 二元三點插值
void CInterpolaterDlg::OnButton16()
{
int i,j;
double u,v,w;
double x[6],y[5],z[30];
for (i=0;i<=5;i++)
x[i]=0.2*i;
for (j=0;j<=4;j++)
y[j]=0.25*j;
for (i=0;i<=5;i++)
{
for (j=0;j<=4;j++)
z[i*5+j]=exp(-(x[i]-y[j]));
}
// 插值運算
CString s, ss;
u = 0.9;
v = 0.8;
w = CInterpolate::GetValueTqip(6, x, 5, y, z, u, v);
s.Format("z(%f, %f) = %f\n",u,v,w);
u = 0.3;
v = 0.9;
w = CInterpolate::GetValueTqip(6, x, 5, y, z, u, v);
ss.Format("z(%f, %f) = %f\n",u,v,w);
s += ss;
// 顯示結(jié)果
AfxMessageBox(s, MB_OK|MB_ICONINFORMATION);
}
// 二元全區(qū)間插值
void CInterpolaterDlg::OnButton17()
{
int i,j;
double u,v,w;
double x[11],y[11],z[121];
for (i=0;i<=10;i++)
{
x[i]=0.1*i;
y[i]=x[i];
}
for (i=0;i<=10;i++)
{
for (j=0;j<=10;j++)
z[i*11+j]=exp(-(x[i]-y[j]));
}
// 插值運算
CString s, ss;
u=0.35;
v=0.65;
w = CInterpolate::GetValueLagrange2(11, x, 11, y, z, u, v);
s.Format("z(%f, %f) = %f\n",u,v,w);
u=0.45;
v=0.55;
w = CInterpolate::GetValueLagrange2(11, x, 11, y, z, u, v);
ss.Format("z(%f, %f) = %f\n",u,v,w);
s += ss;
// 顯示結(jié)果
AfxMessageBox(s, MB_OK|MB_ICONINFORMATION);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -