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

lab_1 / lab1_25

.docx
Скачиваний:
149
Добавлен:
28.01.2022
Размер:
686.78 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ

ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ

БЮДЖЕТНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО

ОБРАЗОВАНИЯ

МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ

(МТУСИ)

Кафедра информатики

Лабораторная работа № 1

«Методы решения нелинейных уравнений»

Почему все-таки берете х0 =1.? Ведь это условие f(1) * f´´(x) > 0 в т. 1 не выполняется нигде, т.к. 2 производная везде отрицательная. Но метод все равно сходится. Объясните Точка 1 выбрана, т.к. находится в промежутке [1; 2], где f(1)*f``(1) < 0 и f(2)*f``(2) > 0. В отчёте была допущена опечатка, границы были 0 и 1 соответственно.

Выполнил студент группы “Сортирный Союз”

username

Москва 2021

Индивидуальное задание

Уравнение

1-й метод

2-й метод

25

cos(x/5)(1+x)1/2-x = 0

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

Метод Ньютона

Протокол вычислений

  1. Отделение корней

format(8);

disp(p);

1. 0.38602 -0.70969 -0.58733

1.2 0.24073 -0.74308 -0.69942

1.4 0.08886 -0.77545 -0.74921

1.6 -0.0694 -0.8071 -0.78992

1.8 -0.23395 -0.83824 -0.82642

2. -0.40468 -0.86901 -0.86053

function s = fi(x)

deff('y = f(x)', 'y = cos(x / 5) * (1 + x)^(0.5) - x');

plot([1 : 0.2 : 2], f);

xtitle('', 'x', 'f(x)')

xgrid;

dy = numderivative(f, x);

dy2 = numderivative(f, x, 2);

s = [x, f(x), dy, dy2];

endfunction

p = zeros(6, 4);

x = 1 : 0.2 : 2;

for i = 1 : 6

p(i, :) = fi(x(i));

end

Вывод: на концах отрезка [1; 2] функция имеет противоположные знаки, 1-я производная знакопостоянна - значит, на этом отрезке уравнение имеет единственный корень

  1. Уточнение корней методом половинного деления


function fbs = f(x) //lab_1_1.sci

fbs = cos(x / 5) * (1 + x)^(0.5) - x;

endfunction

disp(' n a b f(a) f(b) c=(a+b)/2 f(c) b-a');

n = 0; fa = f(a); fb = f(b); c = (a + b) / 2; fc = f(c);

z = [n, a, b, fa, fb, c, fc, b - a];

disp(z);

for n = 1 : 3

if f(c) * f(a) < 0 then b = c;

else a = c;

end

fa = f(a); fb = f(b); c = (a + b) / 2; fc = f(c);

z = [n, a, b, fa, fb, c, fc, b - a];

disp(z);

c = (a + b) / 2;

end

На отрезке [1; 2] условие сходимости для функции выполняется; начальным приближением x0 является точка 1,5

a = 1; b = 2;

exec('/home/peppermint/Documents/study/chislometh/lab_1_1.sci');

" n a b f(a) f(b) c=(a+b)/2 f(c) b-a"

0. 1. 2. 0.38602 -0.40468 1.5 0.01052 1.

1. 1.5 2. 0.01052 -0.40468 1.75 -0.19223 0.5

2. 1.5 1.75 0.01052 -0.19223 1.625 -0.08963 0.25

3. 1.5 1.625 0.01052 -0.08963 1.5625 -0.03925 0.125

n

a

b

f(a)

f(b)

c=(a+b)/2

f(c)

b-a

0

1

2

0.38602

-0.40468

1.5

0.01052

1

1

1.5

2

0.01052

-0.40468

1.75

-0.19223

0.5

2

1.5

1.75

0.01052

-0.19223

1.625

-0.08963

0.25

3

1.5

1.625

0.01052

-0.08963

1.525

-0.03925

0.125

После трёх итераций приближение к корню x3 = 1.525 Погрешность результата: |b3 - a3| = 0.125

  1. Уточнение корней методом Ньютона

Из условия, где f(1) * f´´(1) < 0 и f(2) * f´´(2) > 0 выберем начальное приближение к корню x0 = 1.

Функция и 2 производная имеют разные знаки в т. х=1????? Для получения решения методом Ньютона воспользуемся рекуррентной формулой xn+1=xn-f(xn)/f´(xn).

#include "iostream"

#include "cmath"

using namespace std;

double func_orig(double x)

{

return cos(x / 5) * pow(1 + x, 0.5) - x;

}

double func_der(double x)

{

return -((sqrt(x + 1) * sin(x / 5)) / 5) - 1 + (cos(x / 5) / (2 * sqrt(x + 1)));

}

int main()

{

int n = 0;

double x_curr = 0.5, x_last = 1;

cout << "n x f(x) f'(x)" << endl;

while (abs(x_last - x_curr) > 1E-4)

{

x_last = x_curr;

n++;

x_curr = x_last - (func_orig(x_last) / func_der(x_last));

cout << n << " " << x_curr << " " << func_orig(x_curr) << " " << func_der(x_curr) << endl;

}

return 0;

}

НЕВЕРНО! Программируемый метод делается до заданной точности!!!!!! Исправить!

k

xk

f(xk)

0

1

0.38602

1

1.66236

-0.120042

2

1.51541

-0.00169197

3

1.51328

-3.58939e-07

4

1.51328

-1.62093e-14

  1. Решение уравнения функцией fsolve()

deff('y = g(x)', 'y = cos(x / 5) * (1 + x)^(0.5) - x');

fx = fsolve(0, g)

fx =

1.51328

Скриншоты:

ВЫ изучали ? СИ++. Вот в этой среде и надо программировать!!!

Нет, не изучал, но читал достаточное количество кода на данном языке программирования. На первом курсе обучение программированию проходило на VB.Net, а в методичке (и в лекциях) ни слова не сказано про использование конкретного «средства программирования». Как я понимаю, писать можно на чём угодно, но специально по вашей просьбе мною была написана реализация на C++.

Схему алгоритма я давал на лекции. Вот ее и используйте.

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