实验一 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
后续更新
福利