Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
23.11.2018
Размер:
76.79 Кб
Скачать

Титул

Задание

1. Решить уравнение методами половинного деления, итераций, секущих и касательных с точностью 0,001.

2. Вывести на печать приближенное значение корня, количество итераций, значение невязки.

3. Провести сравнительную характеристику методов.

4. Решить уравнение в среде MATLAB с помощью встроенных функций. промежуток изоляции корня [1.0;1.1]

Решение

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

Создаём файл fun.m, содержащий описание функции .

function z=fun(x)

z=(x.^2)./((1+x).^(1/4))-1.0;

Создаём файл div_two.m (листинг 4.2), содержащий описание функции, возвращающей значение корня уравнения методом половинного деления.

function div_two(f,xn,xk,eps);

% f - Имя m-файла, содержащего описание функции

% xn - Левая граница отрезка, на котором производится поиск решения

% xk - Правая граница отрезка, на котором производится поиск решения

% eps - Точность решения

L=xk-xn;

k=0;

% k - количество итераций

while L>eps

c=(xk+xn)/2;

k=k+1;

if feval(f,c)*feval(f,xn)<0

% feval(f,c) - оператор вычисления в точке х=с значения

% функции, описание которой находится в соответствуюшем файле.

% Имя файла хранится в строковой переменной f

xk=c;

else

xn=c;

end;

L=xk-xn;

end;

x=c

k

fx=feval(f,c)

% fx - значение невязки

Вычисляем значение корня уравнения

>> div_two('fun',1.0,1.1,0.001)

x =

1.0977

k =

7

fx =

0.0011

Решение х=1.0977 получено с точностью 0,001 за семь итераций. При этом значение невязки fx = 0,0011.

Метод итераций

Создаём файл f1.m, содержащий описание функции .

function z=f1(x,m,f)

z=x-m*feval(f,x);

Создаём файл f2.m, содержащий описание функции .

function z=f2(x,m,f)

dx=10^-7;

x1=x+dx;

tmp1=x-m*feval(f,x);

tmp2=x1-m*feval(f,x1);

z=abs((tmp2-tmp1)/dx);

Построим графики функций f1, f2.

>> x=1.0:0.001:1.1;

>> m=0.1;

>> plot(x,f1(x,m,'fun'));

>> hold on

>> plot(x,f2(x,m,'fun'),'--');

>> grid on

Из рисунка видно, что в промежутке [1.0;1.1] функция удовлетворяет условиям.

Создаём файл iter.m, содержащий описание функции, возвращающей значение корня уравнения методом итераций.

function iter(f,x0,eps,m)

x1=f1(x0,m,f);

k=1;

while abs(x1-x0)>eps

x0=x1;

x1=f1(x0,m,f);

k=k+1;

end;

x=x1

k

fx=feval(f,x1)

Вычисляем значение корня уравнения:

>> iter('fun',1.0,0.001,0.1)

x =

1.0928

k =

17

fx =

-0.0072

Решение х=1.0928 получено с точностью 0,001 за 17 итераций. При этом значение невязки fx = 0,0072.

Метод секущих

Создаём файл funp1.m, содержащий описание первой производной функции.

function z=funp1(x0,f)

dx=10^-7;

x=x0+dx;

tmp1=feval(f,x0);

tmp2=feval(f,x);

z=abs((tmp2-tmp1)/dx);

Создаём файл funp2.m, содержащий описание второй производной функции.

function z=funp2(x0,f)

dx=10^-7;

x=x0+dx;

tmp1=funp1(x0,f);

tmp2=funp1(x,f);

z=abs((tmp2-tmp1)/dx);

Создаём файл sek.m, содержащий описание функции, возвращающей значение корня уравнения методом секущих.

function sek(f,f2,a,b,eps)

if feval(f,a)*feval(f2,a,f)>0

xf=a;

x0=b;

else

xf=b;

x0=a;

end;

x1=x0-feval(f,x0)*(x0-xf)/(feval(f,x0)-feval(f,xf));

k=1;

while abs(x1-x0)>eps

x0=x1;

x1=x0-feval(f,x0)*(x0-xf)/(feval(f,x0)-feval(f,xf));

k=k+1;

end;

x=x1

k

fx=feval(f,x1)

Вычислим значение корня уравнения:

>> sek('fun','funp2',1.0,1.1,0.001)

x =

1.0970

k =

2

fx =

-2.2799e-007

Решение х=1,0970 получено с точностью 0,001 за 2 итерации. При этом значение невязки fx = -2.2799e-007.

Метод касательных

Создаём файл kas.m, содержащий описание функции, возвращающей значение корня уравнения методом касательных.

function kas(f,f1,f2,a,b,eps)

if feval(f,a)*feval(f2,a,f)>0

x0=a;

else

x0=b;

end;

x1=x0-feval(f,x0)/feval(f1,x0,f);

k=1;

while abs(x1-x0)>eps

x0=x1;

x1=x0-feval(f,x0)/feval(f1,x0,f);

k=k+1;

end;

x=x1

k

fx=feval(f,x1)

Вычисляем значение корня уравнения

>> kas('fun','funp1','funp2',1.0,1.1,0.001)

x =

1.0970

k =

2

fx =

8.0103e-012

Решение х=1.0970 получено с точностью 0,001 за 2 итерации. При этом значение невязки fx = 8,0103e-012.

2. Сведем полученные данные в таблицу

Метод

Показатель

Половинного деления

Итераций

Секущих

Касательных

Корень

1.0977

1.0928

1.0970

1.0970

Кол-во итераций

7

17

2

2

Значение невязки

0,0011

0,0072

-2.2799e-007

8.0103е-012

3. Наилучшими показателями (количество итераций и значения невязки) обладают два метода – секущих и касательных. Самые плохие показатели получены при использовании метода итераций.

4. Решение с помощью встроенной функции solve:

>> solve('x^2/((1+x)^(1/4))-1=0')

ans =

1.0969815577985598179082789671675

-0.81165232002780264839341885890346

Решение с помощью встроенной функции fzero:

>> [x,f,e_flag,inform]=fzero('x/((1+x^4)^(1/4))+0.5',[-0.6, -0.5])

x =

1.0970

f =

-2.2204e-016

e_flag =

1

inform =

intervaliterations: 0

iterations: 5

funcCount: 7

algorithm: 'bisection, interpolation'

message: 'Zero found in the interval [1, 1.1]'

Соседние файлы в папке 4