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

📄 interpolaterdlg.cpp

📁 插值类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		CString s;
		s.Format("f(%f) = %f\r\n", t[i], yt);
		m_strTargetYi += s;
	}
	AfxMessageBox(m_strTargetYi, MB_OK|MB_ICONINFORMATION);

	// 释放内存
	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() 
{
	// 获取数据
	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, ",");

	// 显示结果
	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);

	// 释放内存
	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() 
{
	// 获取数据
	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, ",");

	// 显示结果
	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);

	// 释放内存
	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() 
{
	// 获取数据
	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, ",");

	// 显示结果
	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);

	// 释放内存
	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() 
{
	// 获取数据
	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, ",");

	// 显示结果
	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);

	// 释放内存
	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() 
{
	// 获取数据
	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, ",");

	// 显示结果
	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);

	// 释放内存
	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
*/
// 第一种边界条件的三次样条函数插值、微商与积分
void CInterpolaterDlg::OnButton13() 
{
	// 获取数据
	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);

	// 显示结果
	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);

	// 释放内存
	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
*/
// 第二种边界条件的三次样条函数插值、微商与积分
void CInterpolaterDlg::OnButton14() 
{
	// 获取数据
	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);

	// 显示结果
	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);

	// 释放内存
	delete[] t;
	delete[] x;
	delete[] y;
	delete[] dy;
	delete[] ddy;
	delete[] z;
	delete[] dz;
	delete[] ddz;
}

/*
37

36
*/
// 第三种边界条件的三次样条函数插值、微商与积分
void CInterpolaterDlg::OnButton15() 
{
	// 获取数据
	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);

	// 显示结果
	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;

	// 显示结果
	AfxMessageBox(s, MB_OK|MB_ICONINFORMATION);
}

// 二元全区间插值
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;

	// 显示结果
	AfxMessageBox(s, MB_OK|MB_ICONINFORMATION);
}

⌨️ 快捷键说明

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