[置顶] 佛科院数值分析实验

发布时间:2014-10-23 23:28:08
来源:分享查询网

实验一 larange插值   很简单,随便写了 #include <iostream> #include <stdio.h> #include <cstdio> using namespace std; int main() { float l[10],x[10],xx,y[10],sum; //这里要用浮点型存储。 int n,i,j; cout<<"请输入已知点的个数"<<endl; cin>>n; cout<<"请输入要计算的点的数值(x)"<<endl; cin>>xx; cout<<"已知的点(x)和(y)"<<endl; for(i=0;i<n;i++) { l[i]=1.0; //赋初值,不然的话会错错的 } for(i=0;i<n;i++) cin>>x[i]>>y[i]; //输入,没什么好说的 for(j=0;j<n;j++) { for(i=0;i<n;i++) { if(i==j) { i++; //因为x[j]不能等于x[i],小学生都知道的事情。所以遇到i=j的情况就i++好了。 } l[j]=l[j]*((xx-x[i])/(x[j]-x[i])); //按照指导书的公式敲成代码,用两重循环就可以了。 } } sum=0.0; //迭代前赋初值 for(i=0;i<n;i++) sum=sum+l[i]*y[i]; //公式,没什么好说的 printf("%f\n",sum); return 0; } 测试数据 3 11.5 11 0.190809 12 0.207912 13 0.224951 答案:0.199368 2.Newton   #include <iostream> #include <stdio.h> #include <cstdio> using namespace std; int main() { float l[10],xx,a[10][10],sum,ca[10]; int n,i,j,k; cout<<"请输入已知点的个数"<<endl; cin>>n; cout<<"请输入要计算的点的数值(x)"<<endl; cin>>xx; cout<<"已知的点(x)和(y)"<<endl; for(i=1;i<=n;i++) { for(j=1;j<=2;j++) { cin>>a[i][j]; //我这里用二维数组来存目的是为了打出差商表 } } ca[0]=1; for(i=0;i<n;i++) { ca[i+1]=ca[i]*(xx-a[i+1][1]); //这里就是(x-x0)*(x-x1)....(x-xn)的意思 } for(j=3;j<=n+1;j++) { k=1; for(i=j-1;i<=n;i++) { a[i][j]=(a[i][j-1]-a[i-1][j-1])/(a[i][1]-a[k][1]); //打差商表,推导过程很简单。用上几组数据找出规律就好了 k++; } } for(i=1;i<=n;i++) { l[i]=a[i][i+1]; //把f(x0),f(x1)....赋予l[i] } sum=l[1]; for(i=1;i<n;i++) { sum=sum+ca[i]*l[i+1]; //最后加起来得出答案 } printf("%f\n",sum); return 0; } 楼主在做这题的时候参考了老师的PPt   ch01第36页,擦。这组数据用3来计算答案是50.但是,老师的PPT 有错,这里错了。所以答案是52. 这组数据答案是52.                4 3 -2 17 0 1 1 2 2 17 实验测试数据 4 0.596 0.4 0.41075 0.55 0.57815 0.65 0.69675 0.80 0.88811   答案:0.63194. 实验三 1.二分法 按上面的变成代码就可以了,没什么好说的 #include <cstdio> #include <algorithm> #include <iostream> #include <string.h> #include <cstring> #include <cmath> #include <math.h> using namespace std; double f(double x) { return x*x*x-x-1; //函数 } int main() { double a=1.0,b=1.5,x,e=0.00001; if(f(a)*f(b)<0) { while(fabs(a-b)>e) { x=(a+b)/2; if(fabs(f(x))<e) { break; } else { if(f(a)*f(x)<0) { b=x; } else if(f(x)*f(b)<0) { a=x; } } } x=(a+b)/2; printf("%0.5lf\n",x); } return 0; } 答案:1.32472   如果是精确到小数点后两位那么就是1.32 可是。你大爷 你的答案居然是就算是精确到后两位也没有差上0.002吧!无语了,什么答案。有图为证,答案错了。就是这样。 2.牛顿迭代法 这题很简单,随便写了,过程很简单。 没心情去弄成通用的了。如果你想弄也很简单的。 #include <iostream> #include <stdio.h> #include <math.h> using namespace std; double f(double x) { return x*x*x+x*x-3*x-3; } double f1(double x) { return 3*x*x+2*x-3; } int main() { int m,N; double x,xx,n,e; cout<<"请输入初值"<<endl; cin>>x; cout<<"请输入根的容许误差"<<endl; cin>>e; cout<<"请输入|f(x)|的容许误差"<<endl; cin>>n; cout<<"请输入迭代次数的容许值"<<endl; cin>>N; m=0; while(f1(x)!=0 || m<=N) { xx=x-f(x)/f1(x); if(fabs(xx-x)==e || f(xx)<n) { printf("%0.6lf\n",xx); break; } x=xx; m++; } return 0; } 答案:1.732051 后续更新 福利  

返回顶部
查看电脑版