佛科院数值分析实验

实验一 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

后续更新


福利



猜你喜欢

转载自blog.csdn.net/a511310132/article/details/16863463