拉格朗日插值(C++版)

拉格朗日插值(C++版)

该版本可根据输入的插值点自动选取其周围的8个点进行7次插值运算

i xi yi i xi yi
1 0.10 0.1103329 11 0.60 1.0288456
2 0.15 0.1736223 12 0.65 1.1592592
3 0.20 0.2426552 13 0.70 1.2972951
4 0.25 0.3176729 14 0.75 1.4430292
5 0.30 0.3989105 15 0.80 1.5965053
6 0.35 0.4865951 16 0.85 1.7577308
7 0.40 0.5809439 17 0.90 1.9266733
8 0.45 0.6821617 18 0.95 2.1032563
9 0.50 0.7904390 19 1.00 2.2873552
10 0.55 0.9059492 20 1.05 2.4787929

#include<iostream>
using namespace std;
double Lagrange(double x[], double y[], double t, int n)
//函数参数说明:x[]和y[]为一维数组形参,表示表格中的数据;t为待求点;n为表格中的结点数
{
	double result = 0;
	double L;
	double t0 = t;
	int q = 0;
	if (t <= x[4]) {//小于第5个点
		q = 8;
		for (int j = 0; j < q; j++) {
			L = y[j];
			for (int k = 0; k < q; k++) {
				if (j == k) {
					continue;
				}
				L *= (t0 - x[k]) / (x[j] - x[k]);
			}
			result += L;
		}
		return result;
	}
	else if (t >= x[n - 5]) {//大于第n-4个点
		q = n - 9;
		for (int j = q; j < n; j++) {
			L = y[j];
			for (int k = q; k < n; k++) {
				if (j == k) {
					continue;
				}
				L *= (t0 - x[k]) / (x[j] - x[k]);
			}
			result += L;
		}
		return result;
	}
	else {//在这之间
		for (int i = 5; i < n; i++) {
			if (t >= x[i - 1] && t <= x[i]) { q = i+4; break;}
		}
		for (int j = q-8; j < q; j++) {
			L = y[j];
			for (int k = q-8; k < q; k++) {
				if (j == k) {
					continue;
				}
				L *= (t0 - x[k]) / (x[j] - x[k]);
			}
			result += L;
		}
		return result;
	}
}

void main() {
	double x[20] = { 0.10,0.15,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,
		0.75,0.80,0.85,0.90,0.95,1.00,1.05 };
	double y[20] = { 0.1103329,0.1736223,0.2426552,0.3176729,0.3989105,0.4865951,
		0.5809439,0.6821617,0.7904390,0.9059492,1.0288456,1.1592592,1.2972951,1.4430292,
		1.5965053,1.7577308,1.9266733,2.1032563,2.2873552,2.4787929 };
	int n = 20;
	double t = 0;
	cout << "请输入插值点:";
	cin >> t;
	cout << "近似结果为:" << Lagrange(x, y, t, n) << endl;
	system("pause");
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

v_wus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值