Vous êtes sur la page 1sur 4

clear all

clc

%% Решение нелинейного уравнения с помощью стандартных функций MatLAB


x = -4 : 0.001 : 4;
y = x - exp(-x);
plot(x,y,[min(x),max(x)],[0,0],'black');grid on % график функции, с помощью
которого определяем отрезок X,
% в котором расположен корень уравнения.
pause(.3)
a = 0; % [a b] - отрезок поиска решений
b = 1;
pause(1.3)
hold on
plot([a,a],[min(y),max(y)],'--g',[b,b],[min(y),max(y)],'--g','LineWidth',3)%
интервал поиска решения
text(a-0.7,2.5,['a = ', num2str(a)])
text(b+0.3,2.5,['b = ', num2str(b)])
x0 = fzero('(x - exp(-x))', [a b]); % корень уравнения
disp(['Решение с помощью fzero:' num2str(x0)]);disp(' ')
figure('color','white')
subplot(3,1,1)
plot(x,y,[min(x),max(x)],[0,0],'black');grid on % график функции
% grid on % сетка
hold on % объединение графиков
plot(x0,0,'r*')% отображение корня уравнения на графике
text(x0-0.5,20,['x0 = ', num2str(x0)])% подпись корня уравнения на графике
% num2str() - функция для перевода числовой переменной в строковую
title('Стандартная функция fzero')

%% Метод хорд
% Основные условия
f=@(x) x-exp(-x);
a=0;
b=1;
e=0.00001;

syms x; %символьная переменная


f2=subs(diff(diff(sym(f(x)))),'x',a); %символьное вычесление второй произв. и
определение её в точке a
if (f(a)*f2>0)
x1=b;
c=a;
else
x1=a;
c=b;
end
while(abs(f(x1))>e)
x1=x1-(f(x1)*(x1-c))/(f(x1)-f(c));
end
disp(['Решение методом хорд: ' num2str(x1) ' f=' num2str(f(x1))]);
% Второй вариант метод хорд
c=a-(f(a)*(b-a))/(f(b)-f(a));
while(abs(f(c))>e)
if f(a)*f(c)>0
a=c;
else
b=c;
end;
c=a-(f(a)*(b-a))/(f(b)-f(a));
end
disp(['Решение методом хорд №2: ' num2str(c) ' f=' num2str(f(c))]);
disp(' ')

%% Метод половинного деления


% Суть метода: последовательно сокращаем область нахождения решения, пока
% не будет достигнута заданная точность.
% clear, clc
f = @(x) x - exp(-x); % функция
exp = 0.0001; % точность
a = -4; % нижний предел
b = 4; % верхний предел
subplot(3,1,2)
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; % корень
disp(['Решение методом половинного деления: ' num2str(x0)]);% выводим решение
disp(['Количество итераций: ' num2str(n)])% количество затраченных итераций
disp(' ');
plot(x0, f(x0),'or')
% text(x0-0.5,20,['x0 = ', num2str(x0)])% подпись корня уравнения на графике
grid on
title(['Метод половинного деления, x0 = ' num2str(x0) ', k = ' num2str(n)])

%% Метод Ньютона
clear all
f = @(x) x - exp(-x); % функция
df = @(x) ( f(x+1e-6) - f(x-1e-6) )/2e-6; % производная (по определению)

e = 0.00001; % точность
a = -4;
b = 4;
subplot(3,1,3)
fplot(f,[a b]),hold on

if f(a)*f(b) < 0 % если знаки на концах отрезка разные, находим корень


Xkm = (a+b)/2; % начальное предположение корня
Xkp = 0;
Yo = f(b);
k = 1;
while abs(Yo) > e
Xk = Xkm - f(Xkm)/df(Xkm);
Xkm = Xk;
Yo = f(Xk);
k = k + 1;
end
disp(['Решение методом Ньютона: ' num2str(Xk)]);% выводим решение
disp(['Количество итераций: ' num2str(k)])% количество затраченных итераций
plot(Xk,f(Xk),'xr')
title(['Метод Ньютона, x0 = ' num2str(Xk) ', k = ' num2str(k)])
grid on
else
disp('на промежутке корня нет')
end
clear all
clc

%% Решение нелинейного уравнения с помощью стандартных функций MatLAB


x = 0 : 0.001 : 4;
y = (x-2).^4 - log(x);
plot(x,y,[min(x),max(x)],[0,0],'black');grid on % график функции, с помощью
которого определяем отрезок X,
% в котором расположен корень уравнения.
pause(.3)
a = 1; % [a b] - отрезок поиска решений
b = 3;
pause(1.3)
hold on
plot(a,0,'og',b,0,'og','LineWidth',3)% интервал поиска решения
text(a-0.3,1.5,['a = ', num2str(a)])
text(b+0.3,1.5,['b = ', num2str(b)])
x0 = fzero('(x-2)^4 - log(x)', [a b]); % корень уравнения
disp(['Решение с помощью fzero:' num2str(x0)]);disp(' ')
figure('color','white')
subplot(3,1,1)
plot(x,y,[min(x),max(x)],[0,0],'black');grid on % график функции
hold on % объединение графиков
plot(x0,0,'r*','LineWidth',3)% отображение корня уравнения на графике
text(x0-0.5,20,['x0 = ', num2str(x0)])% подпись корня уравнения на графике
% num2str() - функция для перевода числовой переменной в строковую
title('Стандартная функция fzero')

%% Метод хорд
% Основные условия
f = @(x) (x-2)^4 - log(x); % функция
a=1;
b=3;
e=0.00001;

syms x; %символьная переменная


f2=subs(diff(diff(sym(f(x)))),'x',a); %символьное вычесление второй произв. и
определение её в точке a
if (f(a)*f2>0)
x1=b;
c=a;
else
x1=a;
c=b;
end
while(abs(f(x1))>e)
x1=x1-(f(x1)*(x1-c))/(f(x1)-f(c));
end
disp(['Решение методом хорд: ' num2str(x1) ' f=' num2str(f(x1))]);
% Второй вариант метод хорд
c=a-(f(a)*(b-a))/(f(b)-f(a));
while(abs(f(c))>e)
if f(a)*f(c)>0
a=c;
else
b=c;
end;
c=a-(f(a)*(b-a))/(f(b)-f(a));
end
disp(['Решение методом хорд №2: ' num2str(c) ' f=' num2str(f(c))]);
disp(' ')

%% Метод половинного деления


% Суть метода: последовательно сокращаем область нахождения решения, пока
% не будет достигнута заданная точность.
% clear, clc
f = @(x) (x-2)^4 - log(x); % функция
exp = 0.0001; % точность
a = 1; % нижний предел
b = 3; % верхний предел
subplot(3,1,2)
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; % корень
disp(['Решение методом половинного деления: ' num2str(x0)]);% выводим решение
disp(['Количество итераций: ' num2str(n)])% количество затраченных итераций
disp(' ');
plot(x0, f(x0),'or','LineWidth',3)
% text(x0-0.5,20,['x0 = ', num2str(x0)])% подпись корня уравнения на графике
grid on
title(['Метод половинного деления, x0 = ' num2str(x0) ', k = ' num2str(n)])

%% Метод Ньютона
clear all

f = @(x) (x-2)^4 - log(x); % функция


df = @(x) ( f(x+1e-6) - f(x-1e-6) )/2e-6; % производная (по определению)

e = 0.00001; % точность
a = 1;
b = 3;
subplot(3,1,3)
fplot(f,[a b]),hold on

if f(a)*f(b) < 0 % если знаки на концах отрезка разные, находим корень


Xkm = (a+b)/2; % начальное предположение корня
Xkp = 0;
Yo = f(b);
k = 1;
while abs(Yo) > e
Xk = Xkm - f(Xkm)/df(Xkm);
Xkm = Xk;
Yo = f(Xk);
k = k + 1;
end
disp(['Решение методом Ньютона: ' num2str(Xk)]);% выводим решение
disp(['Количество итераций: ' num2str(k)])% количество затраченных итераций
plot(Xk,f(Xk),'xr','LineWidth',3)
% text(Xk-0.5,20,['x0 = ', num2str(Xk)])% подпись корня уравнения на графике
title(['Метод Ньютона, x0 = ' num2str(Xk) ', k = ' num2str(k)])
grid on
else
disp('на промежутке корня нет')
end

Vous aimerez peut-être aussi