Найти наименьшее root уравнения в scilab - PullRequest
3 голосов
/ 18 апреля 2020

Мне нужно найти наименьший абсолютный root уравнения с точностью до 0,00001 с использованием scilab. Само уравнение: 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

1 Ответ

2 голосов
/ 22 апреля 2020

Эквивалентная команда 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

...