C语言WFC实现绘制Lagrange插值多项式曲线的函数

前言(引用):

拉格朗日多项式插值
插值方法有许多,常用的、基本的有:拉格朗日多项式插值、牛顿插值、分段线插值、Hermite插值和三次样条插值。这里只将一下拉格朗日多项式插值法:

方法应用
通缩点说,已知n+1个点x1,x2,…,xn的函数值,可以使用lagrange插值求出一个n次多项式插值函数f(x),f(x)是接近未知原函数p(x)的函数,根据插值函数f(x)求出p(x)的未知点

具体引入
已知一个未知函数f(x)的三个点(x1,y1)、(x2,y2)、(x3,y3)

存在使用一个多项式函数经过这三个点,呈现为一根曲线

因此进行合理假设,此曲线为一个二次多项式

拉格朗日认为可通过三根两次曲线来得到这根二次曲线。

关键

因此假设了三根曲线

第一根曲线f1(x),在x1点处,取值为1,其余两点(x2,y2)、(x3,y3)取值为0

第二根曲线f2(x),在x2点处,取值为1,其余两点(x1,y1)、(x3,y3)取值为0

第三根曲线f3(x),在x3点处,取值为1,其余两点(x1,y1)、(x2,y2)取值为0

所以可得到

y1f1(x)曲线可以保证,在x1处,取值为y1,其余两点取值为0

y2f2(x)曲线可以保证,在x2处,取值为y2,其余两点取值为0

y3f3(x)曲线可以保证,在x3处,取值为y3,其余两点取值为0

可以说这三根曲线就可以组成需要得到的那根二次曲线

那么,f(x)=y1f1(x)+y2f2(x)+y3f3(x)
原文链接:https://blog.csdn.net/weixin_47210960/article/details/119428254

代码实现:

//拉格朗日插值法
void CCGDrawingView::Lagrange(double* x,
	double* y, int num, CDC* pDC)
{
	//画原始点
	CPen redPen(PS_SOLID, 1, RGB(255, 0, 0));
	CBrush redBrush(RGB(255, 0, 0));
	CPen* pOldPen = pDC->SelectObject(&redPen);
	CBrush* pOldBrush = pDC->SelectObject(&redBrush);
	for (int i = 0; i < num; ++i) {
		pDC->Ellipse(int(x[i] - 5),
			int(y[i] - 5),
			int(x[i] + 5),
			int(y[i] + 5));
	}
	//绘制Lagrange插值多项式曲线
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
	for (int i = (int)x[0]; i <= (int)x[num - 1]; ++i) {
		double t = i;
		double tx = 0.0;
		double ty = 0.0;
		for (int j = 0; j < num; ++j) {
			double g = 1.0;
			//计算基函数的值
			for (int m = 0; m < num; ++m) {
				if (m == j)
					continue;
				g = g * (t - x[m]) / (x[j] - x[m]);
			}
			//根据基函数的值计算坐标
			tx += x[j] * g;
			ty += y[j] * g;
		}
		//画像素点
		pDC->SetPixel((int)tx, (int)ty, RGB(0, 0, 0));
	}
}

结果呈现:

最近更新

  1. TCP协议是安全的吗?

    2023-12-12 19:32:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-12 19:32:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-12 19:32:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-12 19:32:01       18 阅读

热门阅读

  1. C语言 数组指针

    2023-12-12 19:32:01       39 阅读
  2. SpringBoot中实现跨域的几种常用方式

    2023-12-12 19:32:01       31 阅读
  3. gitea仓库迁移

    2023-12-12 19:32:01       39 阅读
  4. 区块链:改变世界的技术

    2023-12-12 19:32:01       42 阅读
  5. Docker中安装并配置阿里巴巴的Sentinel控制台

    2023-12-12 19:32:01       40 阅读
  6. MySQL_6.MySQL常用创建语句

    2023-12-12 19:32:01       40 阅读
  7. 翻页新篇章:从Offset/Limit到游标分页的全面探索

    2023-12-12 19:32:01       36 阅读
  8. TypeScript 第四节:运算符

    2023-12-12 19:32:01       37 阅读
  9. 12、vue3(十二):用户管理页面搭建

    2023-12-12 19:32:01       37 阅读
  10. 定义一个存活态 HTTP 请求接口

    2023-12-12 19:32:01       37 阅读
  11. 12.11每日一题(备战蓝桥杯循环输出)

    2023-12-12 19:32:01       26 阅读