在Scilab中找到方程的最小根

3
我需要使用Scilab找到方程的最小绝对根,精度为0.00001。方程本身是:x-cos(1.04 * x)= 0。需要绘制图表以确定函数变号的区间。然后计算一阶和二阶导数。必须确定它们的符号,这些符号应该对所有导数都相同(*)。 如果1, 则按照以下公式1进行计算。 如果2, 则按照以下公式2进行计算。
计算在何时结束。
如何在Scilab中实现所有这些?

好的,我试着用matlab做了这个。但我仍然不确定是否所有东西都正确组合在一起,以及如何将其转移到scilab中?

clc;
clear;

syms x
f = x - cos(1.04*x);
a=0.5;
b=1;
eps=0.00001;
i=0;
c=(a+b)/2;
f1=diff(f);
f2=diff(f1);
while(abs(b-a)>eps)
    if((subs(f1,x,c)*subs(f2,x,c))>=0)
        a=a-(b-a)*subs(f,x,a)/(subs(f,x,b)-subs(f,x,a));
        b=b-subs(f,x,b)/subs(f1,x,b);
    else
        a=a-subs(f,x,a)/subs(f1,x,a);
        b=b-(b-a)*subs(f,x,b)/(subs(f,x,b)-subs(f,x,a));
    end
    i=i+1;
end
fprintf('b=% f \n', double(b))
ezplot(f,[0.5 1]),hold on
plot(b,subs(f,x,b),'or')
grid on

这是我在Scilab中拥有的内容。

clc;
clear;
a=0.5;
b=1;
deff ("y = f (x)", "y = x-cos (1.04 * x)")
deff ("y = f1(x)", "y = 1.04.*sin(1.04*x)+1")
deff ("y = f2(x)", "y = 1.0816.*cos(1.04*x)")
eps=0.00001;
i=0;
c=(a+b)/2;
m=0;
com1 = ["k                 a                 b                 absolute          f(a)               f(b)              f1(b)"];
tab = [];
while(abs(b-a)>eps)
    if((f1(c)*f2(c))>=0)
        a=a-(b-a)*f(a)/(f(b)-f(a));
        b=b-f(b)/f1(b);
    else
        a=a-f(a)/f1(a);
        b=b-(b-a)*f(b)/(f(b)-f(a));
    end
    i=i+1;
    m=abs(b-a);
    tab = [tab; i a b m f(a) f(b) f1(b)];
end
disp('b=', double(b))
disp(tab)
fprintfMat("table.txt", tab, "%1.15f", com1)
fplot2d(-10:0.1:10,f)
plot(b,f(b),'or')
xgrid

这个方法的名称是什么?它似乎构造了由牛顿和割线迭代界定的连续区间... - Stéphane Mottelet
也许我提出的方法是不正确的。我只是不知道如何在Scilab中实现它。 - lapos
如果您只需要查找根,请使用内置的fsolve()函数。 - Stéphane Mottelet
好的,我尝试使用fsolve()函数,但是我的老师说我应该使用我在问题中描述的原始方法。 - lapos
这更多是关于我对数学的知识的问题。如果我理解了,我可以轻松地用C++完成它。 - lapos
显示剩余11条评论
1个回答

2

Matlab中ezplot命令的等效命令不存在,但一个接近的命令是fplot2d。要添加网格线,可以使用xgrid命令。

    clc;
    clear;
    a=0.5;
    b=1;
    deff ("y = f (x)", "y = x-cos (1.04 * x)")
    deff ("y = f1(x)", "y = 1.04.*sin(1.04*x)+1")
    deff ("y = f2(x)", "y = 1.0816.*cos(1.04*x)")
    eps=0.00001;
    i=0;
    c=(a+b)/2;
    
    tab = [a,b];
    while(abs(b-a)>eps)
        if((f1(c)*f2(c))>=0)
            a=a-(b-a)*f(a)/(f(b)-f(a));
            b=b-f(b)/f1(b);
        else
            a=a-f(a)/f1(a);
            b=b-(b-a)*f(b)/(f(b)-f(a));
        end
        tab = [tab; a b];
        i=i+1;
    end
    disp('b=% f \n', double(b))
    disp(tab)
    fprintfMat("table.txt",tab)
    fplot2d(-10:0.1:10,f)
    plot(b,f(b),'or')
    xgrid

这张图片是用Scilab导出的,使用了`xs2png(0,"graph.png")`命令:

enter image description here

能否将中间计算结果以文本文件的形式显示在表格中? - lapos
你是指连续的a和b值吗? - Stéphane Mottelet
是的。它们的值应该在文本文件中的表格中输入。 - lapos
我已经添加了表格的构建、显示和输出到文本文件中。现在你应该能够根据需要修改脚本了。 - Stéphane Mottelet
非常感谢您的帮助!一切都很顺利,我甚至修改了您的脚本。在第一行添加了标题。我甚至删除了第一个变量的输出,因为这是不必要的。 - lapos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接