lab_1 / lab1_25
.docxФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ
ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ
БЮДЖЕТНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО
ОБРАЗОВАНИЯ
МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ
(МТУСИ)
Кафедра информатики
Лабораторная работа № 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 |
Половинное деление |
Метод Ньютона |
Протокол вычислений
Отделение корней
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-я производная знакопостоянна - значит, на этом отрезке уравнение имеет единственный корень
Уточнение корней методом половинного деления
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
Уточнение корней методом Ньютона
Из условия, где 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 |
Решение уравнения функцией fsolve()
deff('y
= g(x)', 'y = cos(x / 5) * (1 + x)^(0.5) - x'); fx
= fsolve(0, g)
fx
=
1.51328
Скриншоты:
ВЫ изучали ? СИ++. Вот в этой среде и надо программировать!!!
Нет, не изучал, но читал достаточное количество кода на данном языке программирования. На первом курсе обучение программированию проходило на VB.Net, а в методичке (и в лекциях) ни слова не сказано про использование конкретного «средства программирования». Как я понимаю, писать можно на чём угодно, но специально по вашей просьбе мною была написана реализация на C++.
Схему алгоритма я давал на лекции. Вот ее и используйте.