MAPLE 中的割线方法

问题描述

我正在尝试使用 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);