题目:
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;
}