牛顿插值法c语言csdn,拉格朗日插值算法及牛顿插值算法的C++实现

拉格朗日插值法

声明:本算法源自此博客:http://blog.csdn.net/xiaowei_cqu/article/details/8584966

本算法实现了批数据处理的插值实现,为上面网址博客提及的算法改良版(注:上面所述网址博客算法只能实现单个数据的插值,无法实现批数据插值)。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

算法代码:

#include

#include

#include

using namespace std;

void Lagrange(int N, int N1, vector&X, vector&Y, vector&xp, vector &result);

int main()

{

char a = 'n';

do{

cout << "请输入所需插值点N的值:" << endl;

int N;

int N1;

cin >> N;

vectorX(N, 0);

vectorY(N, 0);

cout << "请输入"<

for (int a = 0; a

{

cin >> X[a];

if (a >= N)

break;

}

cout << "请输入" << N << "个插值点对应的函数值Y[i]:" << endl;

for (int a = 0; a

{

cin >> Y[a];

if (a >= N)

break;

}

cout << "请输入所求xp次数N1的值:" << endl;

cin >> N1;

vectorxp(N1, 0);

vector result(N1, 0);

cout << "请输入" << N1 << "个所求向量xp[i]的值:" << endl;

for (int a = 0; a

{

cin >> xp[a];

if (a >= N1)

break;

}

Lagrange(N, N1, X, Y, xp, result);

for (int a = 0; a < N1; a++)

{

cout << result[a] << endl;

}

cout << "是否要继续?(y/n):";

cin >> a;

} while (a == 'y');

return 0;

}

void Lagrange(int N, int N1,vector&X, vector&Y, vector&xp, vector &result)

{

double temp1=0;

for (int h = 0; h < N1; h++)

{

for (int i = 0; i < N; i++)

{

double temp = Y[i];

for (int j = 0; j < N; j++)

{

if (i != j)

{

temp = temp*(xp[h] - X[j]);

temp = temp/(X[i] - X[j]);

}

}

temp1 += temp;

}

result[h] = temp1;

temp1 = 0 ;

}

}

牛顿插值法:

其公式:

0818b9ca8b590ca3270a3433284dd417.png

算法流程:

0818b9ca8b590ca3270a3433284dd417.png

算法代码:

#include

#include

#include

using namespace std;

double ChaShang(int n, vector&X, vector&Y);

void Newton(int n1, vector& xp, vector&X, vector&Y, vector &result);

int main()

{

char a = 'n';

do

{int n,n1;

cout << "请输入插值点的个数" << endl;

cin >> n;

vectorX(n, 0);

vectorY(n, 0);

cout << "请输入插值点X[i]的值" << endl;

for (int i = 0; i

{

cin >> X[i] ;

}

cout << "请输入插值点Y[i]的值" << endl;

for (int i = 0; i

{

cin >> Y[i];

}

cout << "请输入所求点的个数" << endl;

cin >> n1;

vector xp(n1, 0);

vector result(n1, 0);

cout << "请输入所求插值点xp[i]的值:" << endl;

for (int i = 0; i

{

cin >> xp[i];

}

Newton(n1,xp, X, Y,result);

cout << "输出所求插值点的函数值:" << endl;

for (int h = 0; h < n1; h++)

{

cout<< result[h]<

}

cout << "是否要继续?(y/n):";

cin >> a;

} while (a == 'y');

return 0;

}

double ChaShang(int n, vector&X, vector&Y)

{

double f = 0;

double temp = 0;

for (int i = 0; i

{

temp = Y[i];

for (int j = 0; j

if (i != j) temp /= (X[i] - X[j]);

f += temp;

}

return f;

}

void Newton(int n1, vector& xp, vector&X, vector &Y, vector &result)

{

double temp1 = 0;

for (int h = 0; h < n1; h++)

{

for (int i = 0; i < X.size(); i++)

{

double temp = 1;

double f = ChaShang(i, X, Y);

for (int j = 0; j < i; j++)

{

temp = temp*(xp[h] - X[j]);

}

temp1 += f*temp;

}

result[h] = temp1;

temp1 = 0;

}

}

实验结果:

给定数据值:

0818b9ca8b590ca3270a3433284dd417.png

所求插值点及结果:

0818b9ca8b590ca3270a3433284dd417.png

总结:本算法实现的结果与引用博客的算法结果完全一致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值