在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
题目:用二分法求f(x)=x^3+x^2-3*x-3=0的正根(精度要求精确到1E-3)。 (1)分析结果的正确性。 (2)进一步考虑如何求出所有根。 算法分析: (1)分析题目要求,由于方程是一元三次方程。所以方程应该存在三个根,由于题目要求只求正根,所以下面在用二分法之前应先给定一个正区间。 (2)令f=x^3+x^2-3*x-3,并给定:区间[a,b],其中a>=0,且要保证f(a)*f(b)<0. (3)这里首先令x1=a,x2=b,先给x一个初值为((x1+x2)/2),判断f((x1+x2)/2)即f(x)的正、负。 若为负数即f(x)<0,则把((x1+x2)/2)赋给x1(或x2),即新区间的左(或右)端点; 若为正数即f(x)>0,则把((x1+x2)/2)赋给x2(或x1),即新区间的右(或左)端点; 若为零即f(x)==0,则找到方程的根。 此步骤的原则是使新区间始终保证f(x1)*f(x2)<0。 在此题中由于经过判断知:f=x^3+x^2-3*x-3的一阶导在[1.0,2.0]上大于0,即f=x^3+x^2-3*x-3在[1.0,2.0]上单调增加。又因为此题中f(1)<0,f(2)>0,所以在没找到零点之前,这里的判断条件可以简化为判断区间中左、右端点的正负。与f(a)*f(b)<0的作用相同。 (4)重复步骤(3),直到找到方程的根,或者达到给定精度!则循环停止,这时的x值即为方程的近似值。 C语言实现代码如下: #include<stdio.h>
#include<math.h>
#define f(x) (x*x*x+x*x-3*x-3)
main()
{
float x,x1,x2;
int t;
t=0;
x=0.0;
x1=0.0;
x2=10.0;
while(fabs(x1-x2)>1e-3)
{
t++;
x=(x1+x2)/2.0;
if(f(x)<0.0)
{
x1=x;
printf("x1=%f ",x1);
}
else
if(f(x)>0.0)
{
x2=x;
printf("x2=%f ",x2);
}
else
if(f(x)==0.0)
break;
}
x=(x1+x2)/2.0;
printf("\n\nx=%f\n",x);
printf("The loop number t=%d\n",t);
} Matlab代码如下(two_cut.m脚本文件的内容为): f=inline('x^3+x^2-3*x-3') %把f=x^3+x^2-3*x-3设定为内嵌函数 x1=1.0,x2=2.0 %给定区间[a,b]即[x1,x2]一个初值,这里为[1.0,2.0]. err=1e-3; %给出精度为1E-3。 k=0; %k为一个计数变量,为了统计符合精度时,二分的循环次数。给初值0. while abs(x1-x2)>err; %二分循环的结束条件,最后一次的解变量与倒数第二次的解变量 %的差的绝对值,比精度err小时,则循环结束,否则,循环继续。 x=(x1+x2)/2; %给方程的解变量赋一个初值,为区间的中点。 k=k+1; %循环一次k自加1. format long %对从此行一下的变量进行长精度格式化。 x %这里的x的作用是,显示每次循环时二分之后的当前x的值。 if(f(x)<0) %若为负数即f(x)<0,则把((x1+x2)/2)赋给x1,即新区间的左端点。 x1=x; else if(f(x)>0) %若为正数即f(x)>0,则把((x1+x2)/2)赋给x2,即新区间的右端点。 x2=x; else if(f(x)==0) %若为零即f(x)==0,则找到方程的根。 end end end end x %输出最终的解x k %输出二分法的循环次数在Matlab的命令行中输入(因为我的程序文件保存为:two_cut.m脚本文件): >>two_cut f=Inline function: f(x)= x^3+x^2-3*x-3 x1=1 x2=2 x=1.500000000000000 x=1.750000000000000 x=1.625000000000000 x=1.687500000000000 x=1.718750000000000 x=1.734375000000000 x=1.726562500000000 x=1.730468750000000 x=1.732421875000000 x=1.731445312500000 x=1.731445312500000 k=10 结果分析: 在Matlab的命令行中输入: >>format long >>sqrt(3) ans=1.732050807568877 在与用二分法所求的结果分析可知,有一定误差。通过k的值可知此程序在给定的区间上循 环了10次,经分析发现:用二分法解方程,其方法有以下缺点:收敛速度不快,无法求偶 重根,也无法求复根。 这里进一步分析如何求此方程的所有根:因为此方程是一元三次方程f=x^3+x^2-3*x-3=0, 所以理论上它有三个根。如果任用二分法求出它的其余两个根,那么我们应首先估算这两 根在数轴上的大概位置,然后给定合理的区间,再用二分继续处理。 这里在在Matlab的命令行中输入,并运行: >>x=-2:0.001:2; >>y=x.^3+x.^2-3*x-3; >>plot(x,y) >>grid on 可得到下图: 本文为本人原创!如需使用,请注明出处! |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论