在scilab中使用不动点求解方程



我有一个方程f(x)=exp(x)+3x^2f(x)=0x=?,然后我使用scilab使用不动点迭代来求解该方程,这是我的代码

function fixed_point(fung,x0,err)
x=zeros(100);
ea = 100;
i = 1;
x(i)=x0;
printf(" t i t x(i) t       ea(%%)");
printf("nt %d t %f t %f", i, x(i), abs(ea));
while (abs(ea) >err) do
    i=i+1;
    z =x(i-1);
    x(i) = evstr(fung)+z;
    ea =100*(x(i)-x(i-1))/x(i);
    printf("nt %d t %f t %f", i, x(i), abs(ea));
end
printf("n Akar = %f", x(i));
endfunction

然后我用来称呼它

fixed_point ('exp(z)-(3 .* z .*z)',0.00000000001,0.5)

我终于得到了x(i)=inf,但我认为这不是答案,有人能向我解释我的代码出了什么问题吗?

让我们将答案划分为"子问题":

  1. 一般来说:如果你对解没有概念,就不要使用数值方法。正如Daniel所展示的,这个方程在实数中没有任何解。如果你有一个合理的x0,先画出它的邻域!

  2. 总的来说:你的目标是解决方程还是实现这个方法?Matlab有fsolve函数(您添加了Matlab标签和scilab),或者,如果您想设计自己的函数,牛顿方法在这些容易微分的函数(sin,exp,x^n…)上运行得很好

  3. 特别是:在代码中添加一些内容,以便在解决方案不收敛的情况下逃离while循环。你的输出应该是"不转换",这肯定比神秘的inf要好(例如,打破循环if i>1e3或类似的东西)。

最新更新