今天遇到一题要运用到牛顿插值法寻找e的问题,但我输出的e却总是离实际值有一定差距,不知道式这个方法本身就会有差距,还是我的程式有甚麽问题,来寻求各位的帮助,附上我写的程式
这要看你题目中对误差要求的具体描述,你可能少了最后一项误差值。题目贴出来看一下
查到牛顿插值法的计算 C++
#include <iostream>
#include <cmath>
using namespace std;
double newton_interpolation(double x[], double y[], int n, double e) {
double f[n][n];
for (int i = 0; i < n; i++) {
f[i][0] = y[i];
}
for (int j = 1; j < n; j++) {
for (int i = 0; i < n-j; i++) {
f[i][j] = (f[i+1][j-1] - f[i][j-1]) / (x[i+j] - x[i]);
}
}
double result = f[0][0];
for (int j = 1; j < n; j++) {
double term = f[0][j];
for (int i = 0; i < j; i++) {
term *= (e - x[i]);
}
result += term;
}
return result;
}
int main() {
double x[] = {1, 2, 3, 4, 5};
double y[] = {exp(1), exp(2), exp(3), exp(4), exp(5)};
int n = sizeof(x) / sizeof(x[0]);
double e = 2.71828;
double result = newton_interpolation(x, y, n, e);
cout << "e ≈ " << result << endl;
return 0;
}
不看画“×”的(忽略就好),只看最后一次画“√”的就好了,其实看到这里也就结束啦!如果你跟我的处理方式一样一样,解决这个实验数据处理够用啦!
———————————————————假设有分割线————————————————
1题外话:不知道你有没有发现我是自定义的四舍五入函数?
原因是,我在网上查找的四舍五入是这样的:
在math.h或cmath头文件中有四舍五入有关的函数
但是我试了一下会显示这样的错误,error C2065: ‘round’ : undeclared identifier,(目前还不知道为什么会这样,还没去查)然后我就四舍五入关系写了一个,需要保留的小数,调用函数就可以啦。
/*自定义函数四舍五入*/
int round(float f)
{
if ((int)f+0.5>f)
return (int)f;
else
return (int)f + 1;
}
2题外话****我还用到了绝对值函数,下面是我结合课本所学知识和网上查到,都是我测试过的,比网上找的靠谱哦!(因为关于头文件跟调用函数)
首先,绝对值里可以是任意的两个变量哦,下面是我在处理大物时写的
E=(fabs(e_Zhong_Ever-e0))/1.60e-19; cout<<" E相对误差:"<<E*100<<'%'<<endl;
在处理大物实验数据时,通常在求解相对误差时需要用到绝对值函数
首先,绝对值里可以是任意的两个变量哦,下面是我在处理大物时写的
E=(fabs(e_Zhong_Ever-e0))/1.60e-19; cout<<" E相对误差:"<<E*100<<'%'<<endl;
下面都是我在结合所学知识以及网上查找测试之后写的,因为网上有的介绍的头文件与相应的函数是不匹配的。
# include<iostream>
//# include<cmath>
using namespace std;
int main()
{int a;
//double b;
a=abs(223-3);
//b=fabs(223.8-3.5);
cout<<"a="<<a<<endl;
//cout<<"b="<<b<<endl;
return 0;
}
# include<iostream>
# include<cmath> //浮点型需要求绝对值
using namespace std;
int main()
{int a;
double b;
a=abs(223-3);
b=fabs(223.8-3.5);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
这个就不举例啦,不常用到。