计算机数值方法之方程求根C语言

题目:

f(x)=x3+4x2-10=0[1,2]内的一个实根,且要求满足精度|x*-xn|<0.5×10-5

 

 

     二分法不断逼近求方程的解在之前的学习便有涉及,所以难度不大,和数值计算相关的知识便是,如何限制精度,二分法是用的误差小于(b-a)/2n来满足精度的要求。

      双点割线法是用割线与x轴交点的横坐标作为x的新近似值。重复此过程,不断求出新的x 轴交点的横坐标来作为下一新的近似值。割线法比二分法速度快而且程序简洁,行数少。

       while语句可满足精度的要求。

方法一:二分法

#include<stdio.h>
#include<cstdlib>
int i;
float a[1000];
float b[1000];
float y,x,x1;
int main(){
	i=1;
	x=1.5;
	b[i]=2;
	a[i]=1;
	y=x*x*x+4*x*x-10;
	x1=(b[i]-a[i])/2;
while(x1>0.000005){
	 i++;
	   if(y>0){
		  b[i]=x;
		  a[i]=a[i-1];
		  x=(a[i]+b[i])/2;
		  	y=x*x*x+4*x*x-10;
				x1=(b[i]-a[i])/2;
	   }
	   else if(y==0){
		   printf("%f%d\n",x,i);
		   break;
	   }
	   else if(y<0){
		   b[i]=b[i-1];
		   a[i]=x;
		   x=(a[i]+b[i])/2;
		   	y=x*x*x+4*x*x-10;
				x1=(b[i]-a[i])/2;
	   }
}
if(y>0)
     printf("%f,%d\n",b[i],i);
	   else
printf("%f,%d\n",a[i],i);
return 0;
}

方法二:双点割线法

#include<stdio.h>
#include<cstdlib>
int i=0;
double x[10000];
double temp1,temp2;
int n;
int main(){
	n=1;
	x[n-1]=1.5;
	x[n]=1.2;
while(x[n-1]-x[n]>0.000005||x[n-1]-x[n]<-0.000005)
{
	 x[n+1]=x[n]-(x[n]*x[n]*x[n]+4*x[n]*x[n]-10)*(x[n]-x[n-1])/		 ((x[n]*x[n]*x[n]+4*x[n]*x[n]-10)-(x[n-1]*x[n-1]*x[n-1]+4*x[n-1]*x[n-1]-10));
	 temp1=x[n];
	 temp2=x[n+1];
     n++;
	 x[n-1]=temp1;
	 x[n]=temp2;
	 i++;
	 printf("%f,%d\n",x[n],i);
}   
return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_41892454/article/details/81388796