Портал освітньо-інформаційних послуг «Студентська консультація»

  
Телефон +3 8(066) 185-39-18
Телефон +3 8(093) 202-63-01
 (093) 202-63-01
 studscon@gmail.com
 facebook.com/studcons

<script>

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){

  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),

  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)

  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

 

  ga('create', 'UA-53007750-1', 'auto');

  ga('send', 'pageview');

 

</script>

Чисельні методи розв’язання нелінійних рівнянь на ПК

Предмет: 
Тип роботи: 
Лабораторна робота
К-сть сторінок: 
6
Мова: 
Українська
Оцінка: 

ЗВІТ

про виконання лабораторної роботи № 1-2

“Чисельні методи розв’язання нелінійних рівнянь на ПК”

з дисципліни “Методи обчислень”

 

Мета роботи: ознайомитись з методикою і вивчити різні алгоритми розв’язування нелінійних рівнянь на ЕОМ.

Завдання: Методами поділу відрізка пополам, методом хорд, методом дотичних та методом ітерацій знайти всі корені нелінійного рівняння. Точність знаходження коренів вважати рівною 0,0000001. 

Методом поділу відрізка пополам:

clear, clc

f = @(x) atan(2*x)-0.2*((x-1)^4)+sin(x); % функция

exp = 0.0000001; % точность

a = 2; % нижний предел

b = 4; % верхний предел

fplot(f,[a,b]), hold on % рисуем функцию

fa=f(a); 

fb=f(b);

p=(a+b)/2;

n=1;

fp=f(p);

while abs(fp)>exp

    if fa*fp<0 

        b=p;

    else

        a=p;

    end;

    p=(a+b)/2;

    n=n+1;

    fa=f(a);

    fp=f(p);

end;

x0 = p; % корень

plot(x0, f(x0),'or') 

grid on

title(['x_0=',num2str(x0)])

Методом хорд:

clear, clc

f = @(x) atan(2*x)-0.2*((x-1)^4)+sin(x);

a=2;

b=4;

e=0.0001;

while(abs(a-b)>e)

    c=a-(f(a)*(b-a))/(f(b)-f(a));

    if f(c)*f(b)>0

        b=c;

    else

        a=c;

    end;

end

disp(['Ответ x=' num2str(c,3)]);

x0 = с; % корень

plot(x0, f(x0),'or') 

grid on

title(['x_0=',num2str(x0)])

 

Методом дотичних:

clear, clc; 

e = 0.000001;

f = @(x) atan(2*x)-0.2*((x-1)^4)+sin(x);

df = @(x) (2/(4*(x^2)+1))-0.8*((x-1)^3)+cos(x);

a=0; b=1; N=0;

y1=f(a);  y2=f(b);

z1=df(a); z2=df(b);

N=4;

ezplot(f,[a, b]), hold on

 

while 1

    s=((z2*b - z1*a)-(y2-y1))/(z2-z1);

    y=f(s); z=df(s);

    N = N + 2;

    if z==0 | b-a < 2*e

        x=s;

        break;

    elseif z>0

        b=s; y2=y; z2=z;

    else

        a=s; y1=y; z1=z;

    end

end

 

if z~=0

    x=(a+b)/2;

    y=f(x);

end

fprintf('Метод касательных \n \n');

fprintf('x = %.5f \n', x);

fprintf('y = %.5f \n \n', y);

fprintf('Количество итераций: %i \n', N);

ezplot(f,[-0.5 1]),hold on

plot(x,y,'or'), grid on

grid on

Метод ітерацій: 

clear, clc

f = inline('atan(2*x)-0.2*((x-1)^4)+sin(x)'); %ф.inline чтобы задать строку

x = -10:0.01:10;

y = f(x);

plot(x,y); grid

% Метод простых итераций

eps = 1e-4;

x0 = 1;

% значение производной в начальной точке:

L0 = 2e-6./(f(x0+1e-6)-f(x0-1e-6)); 

iter = 0; 

x = x0;

razn = 100;

while abs(razn)>eps

    xn = x - L0*f(x);

    razn=xn-x;

    x=xn;

    iter=iter+1;

end

x

iter

hold on

plot(x,f(x),'or'), grid on

Обчислимо вираз:   =L0

похідну обчислюємо приблизно, за допомогою невеликого прирісту:

де h = 10-6, отримаємо:     

Комбінований:

clear, clc

syms x

f = x^3+6*x-5;

a=0.5;

b=1;

eps=0.000001;

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

 

Висновок: Я навчилась розв’язувати нелінійні рівняння на ПК різними чисельними методами: половинного ділення, хорд, дотичних(Ньютона), ітерацій (послідовних наближень), комбінаційний (хорд та дотичних).

 

Фото Капча