问题描述
我正在尝试使用 MAPLE 中的正割方法找到 f(x)=0 的负解,其中 f(x)=e^(sin(x))-x^2-x+1。但是,我的代码没有给我正确的解决方案。我做错了什么?
>restart
>Digits:=20
>f:=x->exp(sin(x))-x^2-x+1;
>a:=-5; b:=0;
>x[0]:=a;x[1]:=b;
>epsilon:=Float(1,-15);
>x[0]:=-4:x[1]:=-1:
ind:=0
while abs(x[2]-x[1])>epsilon do
x[2]:=evalf(x[1]-f(x[1])*(x[1]-x[0])/(f(x[1])-f(x[0])));
ind:=ind+1:
od:
printf("Numerical Solution %a\n",x=x[2]);
printf("Number of iterations %a",ind);
解决方法
如果您将 od:
更改为 od;
,那么它不会抑制循环内语句的输出显示。
这样做会揭示您的代码正在执行的操作的详细信息。
主要问题是循环中的代码没有使用ind
。分配给 x[2]
并使用 x[1]
和 x[0]
是硬编码的。
但您想要的是一种方案,其中各种 x
值取决于 ind
计数器。
首先,将 od:
更改为 od;
并运行它。然后尝试以下类似的操作,看看它有何不同。
restart;
Digits:=30;
f:=x->exp(sin(x))-x^2-x+1;
a:=-5; b:=0;
x[0]:=a;x[1]:=b;
epsilon:=Float(1,-15);
x[0]:=-4:x[1]:=-1:
ind:=0;
while abs(x[ind+1]-x[ind])>epsilon do
ind := ind+1;
x[ind+1]:=evalf( x[ind]
- f(x[ind]) * ( x[ind] - x[ind-1] )
/( f(x[ind]) - f(x[ind-1]) ) );
od;
printf("Numerical Solution %a\n",x=x[ind+1]);
printf("Number of iterations %a",ind);