close

Вход

Забыли?

вход по аккаунту

?

Готовый курсовик(Фрейман)

код для вставкиСкачать
Министерство образования и науки Российской Федерации
Государственное образовательное учреждение высшего профессионального образования
"Новгородский государственный университет имени Ярослава Мудрого"
(НовГУ)
Великий Новгород
Институт электронных и информационных систем
Кафедра прикладной математики и информатики
КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ "ЧИСЛЕННЫЕ МЕТОДЫ" Выполнил:
студент группы 0311
___________А. А. Фрейман
" ___"_____________2013 г.
Проверил:
к.ф.-м.н., доцент
_____________Т. В. Жгун
" ___"_____________2013 г.
ВАРИАНТ 9
1 ЗАДАНИЕ 1
Найти корни уравнения x^134-2,435 cos⁡x=0 методом итераций с точностью ε=〖10〗^(-5).
1.1 ИДЕЯ МЕТОДА
Представим функцию f(x)=0 в виде x=φ(x). Итерационная последовательность x_n=φ(x_(n-1) ), сходится к корню функции f(x).
1.2 РЕШЕНИЕ
Заданная функция является четной, поэтому будем искать только положительные корни. На рисунке 1.1 представлен график функции f(x).
Рис. 1.1 - График функции f(x)
Из графика видно, что в качестве отрезка локализации корня можно взять отрезок [0.5, 1.5]. Преобразовав исходное уравнение к виду x=φ(x), получим что φ(x)=√(134&2.435 cos⁡x ).
Требуемая точность будет достигнута, когда будет выполнено условие 1/(1-q) |x_n - x_(n-1) |<ε , где q=max┬(x∈[0.5, 1.5])⁡〖|φ^' (x)|〗. В нашем случае
|φ^' (x)|=√(134&2.435)/134∙sin⁡x/cos^(133/134)⁡x положительная возрастающая функция на отрезке локализации, следовательно, она достигает максимума в правой границе отрезка: q=|φ^' (1.5)|≈0.1.
В таблицу 1.1 занесены результаты выполнения программы, реализующей поиск корня методом простой итерации (см. Приложение 1).
Таблица 1.1 - Поиск корня уравнения методом простых итераций
Номер итерации, nx_n1/(1-q) |x_n - x_(n-1) |00.5-11.00568300.561870021.00198270.004111531.00202610.000048341.00202560.0000006Таким образом, с помощью метода простой итерации за 4 шага был получен корень уравнения x^134-2,435 cos⁡x=0. Полученный корень:
x=1.00203 ±0.00001.
2 ЗАДАНИЕ 2
Функция f(x) задана таблично. Пользуясь интерполяционной формулой Ньютона, вычислить значение функции для аргумента x=257/345.
Таблица 2.1 - Задание функции f(x)
x f(x)x f(x)x f(x) 0
0,1
0,2
0,3
0,4
0,5
0,61,00000
1,20500
1,42007
1,64538
1,88124
2,12815
2,38676 0,7
0,8
0,9
1,0
1,1
1,2
1,32,65797
2,94290
3,24293
3,55975
3,89537
4,25216
4,63285 1,4
1,5
1,6
1,7
1,8
1,9
2,05,04065
5,47918
5,95261
6,46561
7,02350
7,63219
8,29835Оценить погрешность вычислений, погрешность метода, суммарную погрешность, если точность входных данных одинакова δx^*=δy^*.
2.1 ИНТЕРПОЛЯЦИОННАЯ ФОРМУЛА НЬЮТОНА
Если узлы интерполяции равноотстоящие и упорядочены по величине, так что x_(i+1)-x_i=h=const, то интерполяционный многочлен можно записать в форме Ньютона:
P_n (x)= y_0+(∆y_0)/1!h (x-x_0 )+(∆^2 y_0)/(2!h^2 ) (x-x_0 )(x-x_1 )+...+
+(∆^n y_0)/(n!h^n ) (x-x_0 )(x-x_1 )∙...∙(x-x_n )
где ∆^k y_0 - конечные разности k-го порядка.
Погрешность интерполяции при этом может быть вычислена по формуле
R_n (x)=(f^((n+1) ) (ξ))/(n+1)! (x-x_0 )(x-x_1 )∙... ∙(x-x_(n+1) )≈
≈(∆^(n+1) y_0)/((n+1)!h^(n+1) ) (x-x_0 )(x-x_1 )∙... ∙(x-x_(n+1))
2.2 ИНТЕРПОЛЯЦИЯ
Интерполируем заданную функцию многочленом третьей степени, для этого возьмем в таблице 5 точек (пятая точка необходима для вычисления погрешности интерполяции) и вычислим конечные разности до 4-го порядка включительно. Поскольку нам необходимо вычислить значение функции в точке x=257/345≈0.74493, то из таблицы выбираем точки от 0.7 до 1.1. Получившиеся конечные разности представлены в таблице 2.2.
Таблица 2.2 - Конечные разности для заданной функции
x_ny_n〖∆y〗_n〖∆^2 y〗_n〖∆^3 y〗_n〖∆^4 y〗_n0.72.657970.284930.015100.001690.000320.82.942900.300030.016790.002010.93.242930.316820.018801.03.559750.335621.13.89537Воспользовавшись полученными данными и интерполяционной формулой Ньютона, получим следующий интерполяционный многочлен:
N_3 (x)=2.65797 +0.28493/(1!∙0.1) (x-0.7)+ 0.01510/(2!∙ 〖0.1〗^2 ) (x-0.7)(x-0.8)+
+ 0.00169/(3!∙〖0.1〗^3 ) (x-0.7)(x-0.8)(x-0.9)=
= 0.281667 x^3+0.079 x^2+2.25478 x+0.9443.
Вычислим значение многочлена в заданной точке:
N_3 (257/345)=2.78422.
Ошибка интерполяции в данном случае вычисляется по формуле:
R_3 (x)=0.00032/(4!∙〖0.1〗^4 ) (x-0.7)(x-0.8)(x-0.9)(x-1.0).
В нашем случае она составляет:
〖|R〗_3 (257/345)|=0.0000130492
Оценим погрешность вычислений, учитывая, что погрешность входных данных равна ε=〖10〗^(-5). Относительные погрешности различных арифметических операций будем вычислять по следующим формулам:
δ(a+b)=max⁡〖(δa, δb)〗
δ(a-b)=|(a+b)/(a-b)| max⁡〖(δa, δb)〗
δ(a∙b)=δa+ δb
δ(a/b)=δa+ δb.
Очевидно что наибольшую погрешность будет давать последнее слагаемое, найдем его погрешность по указанным правилам:
δ((∆^3 y_0)/(3!h^3 ) (x-0.7)(x-0.8)(x-0.9))≈0.05503944
Следовательно, относительная погрешность вычислений составляет δ_в≈0.05503944.
Общая погрешность δ_общ=δ_в+δ_мет=0.0550524892. Абсолютная ∆_общ≈0.15. Конечный результат: значение функции в точке x=257/345 составляет 2.78±0.15.
3 ЗАДАНИЕ 4
С точностью ε = 〖10〗^(-3) найти наименьший положительный корень уравнения f(x)=0 тремя способами: методом половинного деления, методом Ньютона, методом хорд. Результаты занести в таблицу. Сделать выводы.
f(x)=tg 2.79x+3x
3.1 ИССЛЕДОВАНИЕ ФУНКЦИИ
Построим график функции f(x) (см. рис 2.1). По нему видно, что в качестве отрезка локализации наименьшего положительного корня можно взять отрезок [0.6, 1.0].
Рис. 2.1 - График функции f(x)
3.2 МЕТОД ПОЛОВИННОГО ДЕЛЕНИЯ
Идея метода состоит в последовательном делении пополам отрезка, на котором содержится простой корень уравнения x^*.
Разделим исходный отрезок [a, b] пополам: c=(a+b)/2. Проверяя знаки f(a), f(b), f(c) выясним в каком из отрезков [a,c] или [c,b] содержится корень
x^* ∈ [a,c] , если f(a)·f(c)<0;
x^* ∈ [c,b] , если f(c)·f(b)<0.
Выбранный отрезок принимаем за [a,b] и повторяем это до тех пор, пока получаемый отрезок не сожмется до заданной степени точности.
3.3 МЕТОД НЬЮТОНА
Зададим некоторое начальное приближение x_0∈[a,b] и линеаризуем функцию f(x) в окрестности x_0 с помощью ряда Тейлора:
f(x)=f(x_0 )+f^' (x_0 )(x-x_0)
Решим линеаризованное уравнение f(x_0 )+f^' (x_0 )(x-x_0 )=0, трактуя его решение x как первое приближение к корню
x_1=x_0-(f(x_0))/(f^' (x_0)).
Продолжая этот процесс, приходим к формуле Ньютона
x_n=x_(n-1)-(f(x_(n-1)))/(f^' (x_(n-1))).
3.4 МЕТОД ХОРД
Этот метод можно получить из метода Ньютона, заменив производную отношением разности функции к разности аргумента в окрестности рассматриваемой точки:
f^' (x)≈(f(x+h)-f(x))/h
x_n=x_(n-1)-(f(x_(n-1) )(x_(n-1)-x_(n-2)))/(f(x_(n-1) )-f(x_(n-2))).
Геометрически это означает, что приближенным значением корня считается точка пересечения секущей, проходящей через две точки функции f(x_(n-1) ) и f(x_(n-2)), с осью абсцисс.
3.5 РЕЗУЛЬТАТ
Ниже представлен результат, который был получен при реализации вышеизложенных методов поиска корня для заданной функции. Листинги программ представлены в приложении 2.
Таблица 3.1 - Поиск корня уравнения методом половинного деления
Номер шага, nab|b-a|00.60001.0000-10.60000.80000.200020.70000.80000.100030.70000.75000.050040.70000.72500.025050.71250.72500.012560.71250.71880.006370.71560.71880.003180.71720.71880.001690.71800.71880.0008
Таблица 3.2 - Поиск корня уравнения методом Ньютона
Номер шага, nx_n|x_n-x_(n-1) |00.6000-10.62950.029520.67000.040530.70520.035240.71770.012550.71870.0009Таблица 3.3 - Поиск корня уравнения методом хорд
Номер шага, nx_n|x_n-x_(n-1) |00.6-10.7-20.70520.105230.70900.003840.71800.009050.71860.0006
Оценивая полученный результат, можно сказать, что данные методы равны между собой: хотя метод половинного деления нашел корень за 9 итераций, но он требует меньше вычислений. Полученный корень x=0.718±0.001.
4 ЗАДАНИЕ 5
Дана таблица значений функции f(x). Вычислить значения f'(x) и f''(x) в заданных точках. Оценить погрешность вычислений, считая, что функция в таблице задана точно. Аргумент x=257/345.
Таблица 4.1 - Задание функции f(x)
x f(x)x f(x)x f(x) 0
0,1
0,2
0,3
0,4
0,5
0,61,00000
1,20500
1,42007
1,64538
1,88124
2,12815
2,38676 0,7
0,8
0,9
1,0
1,1
1,2
1,32,65797
2,94290
3,24293
3,55975
3,89537
4,25216
4,63285 1,4
1,5
1,6
1,7
1,8
1,9
2,05,04065
5,47918
5,95261
6,46561
7,02350
7,63219
8,29835
4.1 ВЫЧИСЛЕНИЕ ПРОИЗВОДНОЙ
Интерполяционный многочлен был уже вычислен нами ранее (см. раздел 2). Воспользуемся уже имеющимся результатом:
N_3 (x)=2.65797 +0.28493/(1!∙0.1) (x-0.7)+ 0.01510/(2!∙ 〖0.1〗^2 ) (x-0.7)(x-0.8)+
+ 0.00169/(3!∙〖0.1〗^3 ) (x-0.7)(x-0.8)(x-0.9).
Найдем первую и вторую производную данного многочлена:
N_3^' (x)=0.28493/(1!∙0.1) + 0.01510/(2!∙ 〖0.1〗^2 ) ((x-0.7)+(x-0.8))+
+ 0.00169/(3!∙〖0.1〗^3 ) ((x-0.7)(x-0.8)+ (x-0.7)(x-0.9)+(x-0.8)(x-0.9))
N_3^'' (x)= 0.01510/( 〖0.1〗^2 )+ 0.00169/(3!∙〖0.1〗^3 )((x-0.7)+(x-0.8)+ (x-0.7)+
+(x-0.9)+(x-0.8)+(x-0.9)) Вычислим значение производных в заданной точке: N_3^' (257/345)=2.84139,
N_3^'' (257/345)=1.44599.
Найдем вычислительную погрешность, так же как это было сделано ранее в разделе 2. В итоге были получены следующие значения: δ_(в, N')≈0.003700967, δ_(в, N'')≈0.000459423. Конечный результат: значение первой и второй производной функции в точке x=257/345:
N_3^' (257/345)=2.841±0,011, N_3^'' (257/345)=1.445±0,001.
5 ЗАДАНИЕ 6
Вычислить определённый интеграл тремя способами с помощью формул: трапеций, Симпсона, прямоугольников (3 шт.) с числом узлов n=12 для каждого метода. Оценить погрешность вычислений интеграла по формуле Рунге.
∫_0^1▒√x sin⁡x dx
5.1 ФОРМУЛА ТРАПЕЦИЙ
∫_a^b▒〖f(x)dx≈h/2 ∑_(k=0)^(n-1)▒(f(x_k )+f(x_(k+1) )) ,〗
где h=(b-a)/n - величина шага, а x_k=a+kh - узлы интегрирования.
5.2 ФОРМУЛА СИМПСОНА
∫_a^b▒f(x)dx≈h/2 (f(x_0 )+2∑_(k=1)^(n-1)▒f(x_k ) +4∑_(k=1)^n▒f((x_(k-1)+x_k)/2) +f(x_n )),
где h=(b-a)/n - величина шага, а x_k=a+kh - узлы интегрирования 5.3 ФОРМУЛА ПРЯМОУГОЛЬНИКОВ
Формула левых прямоугольников
∫_a^b▒f(x)dx≈h∑_(k=0)^(n-1)▒f(x_k ) .
Формула правых прямоугольников:
∫_a^b▒f(x)dx≈h∑_(k=1)^n▒f(x_k ) .
Формула средних прямоугольников:
∫_a^b▒f(x)dx≈h∑_(k=0)^(n-1)▒f((x_k+x_(k+1))/2) .
Везде выше h=(b-a)/n - величина шага, x_k=a+kh - узлы интегрирования.
5.4 ОЦЕНКА ПОГРЕШНОСТИ
Интеграл вычисляется по выбранной формуле (прямоугольников, трапеций, Симпсона) при величине шага, равном h, а затем при величине шага, равном h/2. Погрешность вычисления значения интеграла при величине шага, равном h, определяется по формуле Рунге:
R≈α|I_h-I_(h/2) |.
Для формул прямоугольников и трапеций α=1/3, для формулы Симпсона α=1/15.
5.5 РЕЗУЛЬТАТ
В таблице 5.1 представлен результат выполнения программы (см. приложение 3), реализующей изложенные выше методы численного интегрирования для заданной функции. Таблица 5.1 - Результат численного интегрирования
МетодI_h,n=12I_(h/2),n=24α|I_h-I_(h/2) |Формула левых прямоугольников0.32966580.34682130.0057185Формула правых прямоугольников0.39978840.38188260.0059686Формула средних прямоугольников0.36397680.36415820.0000605Формула трапеций0.36472710.36435190.0001251Формула Симпсона0.36422690.36422280.0000003
Подводя результат можно сказать, что наилучший результат дала формула Симпсона. Искомый интеграл равен:
∫_0^1▒√x sin⁡x dx≈0.364226±0.000001.
6 ЗАДАНИЕ 7
Вычислить интеграл по формуле Гаусса и оценить погрешность для числа узлов n=4.
∫_(-1)^1▒〖dx/√(9+x) 〗
6.1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Квадратурная формула Гаусса:
∫_(-1)^1▒〖f(x) dx=∑_(k=1)^n▒〖A_k f(x_k ) 〗+R_n 〗
где x_k - корни полинома Лежандра -й степени;
A_k - веса, вычисляемые по формуле
A_n=2/((1-x_k^2 ) [P_n^' (x_k )]^2 );
R_n - остаточный член формулы Гаусса, вычисляемый по формуле
R_n=(2^(2n+1) [n!]^4)/((2n+1) [2n!]^3 ) f^((2n) ) (ξ), -1<ξ<1.
6.2 РЕШЕНИЕ
Для случая n=4 нули полинома Лежандра и соответствующие веса представлены в таблице 6.1.
Таблица 6.1 - Нули полинома Лежандра 4-й степени и соответствующие веса
x_kA_k-0.3399810.6521451-0.8611360.34785480.8611360.34785480.3399810.6521451
Воспользовавшись формулой Гаусса, найдем, что искомый интеграл равен
∫_(-1)^1▒〖dx/√(9+x) 〗≈0.6521451/√(9-0.339981)+0.3478548/√(9-0.861136) +0.3478548/√(9 + 0.861136)+
+0.6521451/√(9+0.339981)=0.6677010034.
Вычисляя значение остаточного члена, получим что
R_n≈4.805∙〖10〗^(-11)≈1∙〖10〗^(-10).
Следовательно, искомый интеграл равен
∫_(-1)^1▒〖dx/√(9+x) 〗=0.6677010034±1∙〖10〗^(-10).
7 ЗАДАНИЕ 11
Сравнить работу методов с высоким порядком сходимости для достижения заданной точности. ε = 0,001 (метод Ньютона, метод секущих, метод Стефенсена).
x^134-2,435 cos⁡x=0
7.1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Метод Ньютона был описан ранее в пункте 3.3. Метод секущих и метод Стефенсена являются модификациями метода Ньютона. Отличие для метода секущих заключается в том, что производная заменена разностным соотношением:
(f(x_n )-f(x_(n-1) ))/(x_n-x_(n-1) ).
Метод Стефенсена же использует следующее соотношение взамен производной:
(f(x_n+f(x_n))-f(x_n ))/f(x_n ) .
7.2 РЕШЕНИЕ
Искомая функция была ранее исследована в разделе 1. Несколько модифицируем ее, поскольку если использовать ее напрямую, то мы столкнемся с некоторыми вычислительными сложностями. Приведем исходную функцию к следующему виду:
((x/2)^134-2,435 cos⁡〖x/2〗)/〖10〗^13 =0.
При таком преобразовании исходные корни увеличатся в два раза.
Результаты выполнения программы (см. приложение 4) занесены в таблицу 7.1.
Таблица 7.1 - Сравнение методов Ньютона, секущих, Стефенсена
Метод НьютонаМетод секущихМетод Стефенсенаnx_n〖|x〗_n-x_(n-1) |nx_n〖|x〗_n-x_(n-1) |nx_n〖|x〗_n-x_(n-1) |02.1-02.05-02.1-12.08440.015612.1-12.08440.015622.06890.015522.04800.052022.06890.015532.05360.015232.04630.001832.05360.015242.03890.014842.03270.013542.03890.014852.02520.013752.02470.008152.02520.013762.01370.011462.01610.008662.01370.011472.00660.007272.00990.006272.00660.007282.00420.002382.00600.003982.00430.002392.00410.000292.00440.001692.00400.0002102.00410.0003В результате был получен корень преобразованного уравнения
x=2.004±0.001.
Учитывая преобразования, корень исходного уравнения
x=1.002±0.001.
Сравнивая работу методов, можно сказать, что результат был достигнут примерно за одинаковое число шагов.
8 ЗАДАНИЕ 13
Вычислить коэффициенты обусловленности корней полинома пятой степени в зависимости от коэффициентов полинома a priori и a posteori, то есть теоретически и вычислив корни полинома с помощью приближенных методов по формуле Ньютона. Покажите, что для кратных и простых корней метод имеет различную скорость сходимости.
Коэффициенты уравнения вещественны и заданы с точностью ε_м, которая должна быть предварительно подсчитана.
(х-1.32154) (х-4)^2 (х-5)^2=0
8.1 АПРИОРНАЯ ОЦЕНКА ПОГРЕШНОСТЕЙ
Вычислим корни уравнения. Они равны:
x1= 1.32154 - корень первой кратности
x2,3 = 4 - корень второй кратности
x4,5 =5- корень второй кратности
Сначала найдем коэффициенты обусловленности для корня первой кратности.
Раскроем в уравнении скобки и получим:
Рассмотрим функцию:
F(x, a_0,a_1,a_2,a_3,a_4, a_5 )=a_5 x^5+a_4 x^4+a_3 x^3+a_2 x^2+a_1 x+a_0.
Погрешность функции многих переменных вычисляем по формуле:
δx_k=∑_i▒〖ν_i δa_i 〗
где ν_i - коэффициенты обусловленности;
δa_i - относительная погрешность коэффициентов.
При этом коэффициенты обусловленности вычисляются по формуле
ν_i=| 〖F_(a_i)^'∙a〗_i/(F_x^'∙x)|_(x=x_k ).
Погрешность входных данных составит 〖2ε〗_м за счёт произведения степеней и изначальных коэффициентов.
8.2 ВЫЧИСЛЕНИЕ МАШИННОГО ЭПСИЛОН
Вычислив машинный эпсилон с помощью программы в приложении 5, получили следующее значение:
ε_м=1.110223∙〖10〗^(-16)≈1∙〖10〗^(-15).
8.3 РЕЗУЛЬТАТЫ
В следующих таблицах представлены результаты, полученные при выполнении программы.
Таблица 8.1 - Вычисление коэффициентов обусловленности a priori
Коэффициентых_1=1.32154х_2,3=4х_4,5=5ν_510.89100341056084400304533314407589181635011813.7013516ν_423.84461039303416300201807277902318239706522832.4086227ν_324.7225715080112210019169005965975327101368160130.94685ν_215.89063293526252200341653742446606422254552343592.5083ν_16.468036410554395501167175483813780391160902207155.687ν_01.34937382494873750Таблица 8.2 - Корни уравнения, вычисленные методом Ньютона
Начальное приближениеПолученный кореньЧисло итераций1.11.321539999999999±0.00000000000000153.83.999999 ± 0.000001305.24.999999 ± 0.000001318.4 ВЫВОД
Как видно из решения, скорость сходимости метода Ньютона-Рафсона резко снижается при нахождении кратных корней. 9 ЗАДАНИЕ 14
Вычислить приближённые значения производных (первой и второй) для функции: 〖f(x)=x〗^134-2,435 cos⁡x в точке x=0.68.
Найдите приближения к первой производной по указанному правилу. Используйте формулу центрального разностного отношения для значений h=〖10〗^k ∛(ε_м )., где k=-10, -9, -8, ...,9, 10.
Вычислите приближения для вторых производных с тем же шагом. В каждом случае сравните вычисленные приближения с истинными значениями производных. Можете ли вы объяснить, как на выбор наилучшего значения h влияет поведение функции f(x) вблизи точки x?
Сделайте выводы, проанализировав погрешность вычислений. Результаты оформите в таблице, сравнив точные и приближенные значения производных, а также полученную ошибку. Приведите график ошибки в зависимости от k.
9.1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Производные вычисляем по формулам:
df/dx≈(f(x+h)-f(x-h))/2h,
(d^2 f)/(dx^2 )≈(f(x-h)-2f(x)+f(x-h))/h^2 ,
где h=〖10〗^k ∛(ε_м ), k=-10, -9, -8, ...,9, 10.
9.2 РЕЗУЛЬТАТЫ
Значение производных данной функции:
f'(0.68)≈1.53111,
f''(0.68)≈1.89339.
Результат, полученный с помощью программы из приложения 6, представлен в следующих таблицах.
Таблица 9.1 - Приближенное вычисление первой производной khf'(x)∆f'(x)-100.00000000000000051.29563743797395810.2354735755110129-90.00000000000000481.52565340622156790.0054576072634032-80.00000000000004811.52997332559776720.0011376878872038-70.00000000000048061.53109808371838010.0000129297665910-60.00000000000480621.53111314140080080.0000021279158297-50.00000000004806221.53111082466074900.0000001888242221-40.00000000048062171.53111092481971500.0000000886652561-30.00000000480621741.53111103221990400.0000000187349329-20.00000004806217381.53111101333181780.0000000001531533-10.00000048062173841.53111101355390460.000000000068933500.00000480621738391.53111101350266330.000000000017692310.00004806217383941.53111101289432390.000000000590647120.00048062173839371.53111095453775900.000000058947212030.00480621738393741.53110511878441850.000005894700552640.04806217383937351.53052161082786700.000589402657104150.4806224.84976 ·1084.84976·10864.806221.20157·10981.20157·1098748.06221.53644·102241.53644·102248480.622-94806.221048062.2
Таблица 9.2 - Приближенное вычисление второй производной
khf''(x)∆f''(x)-100.00000000000000054.5997·10144.5997·1014-90.0000000000000048-2.90063·10122.90063·1012-80.0000000000000481-1.36114·1091.36114·109-70.0000000000004806-1.33767·1081.33767·108-60.0000000000048062-5.82942·1065.82942·106-50.00000000004806226336.326334.43-40.0000000004806217-743.931745.824-30.00000000480621740.41772787809611691.4756616920623926-20.00000004806217381.93098231828678020.0375927481282707-10.00000048062173841.89357361341035710.000184043251847600.00000480621738391.89339214115554010.000002570997030610.00004806217383941.89338954119845290.000000028960056620.00048062173839371.89338953338928830.000000036769221330.00480621738393741.89338592542894140.000003644729568240.04806217383937351.89302512505967520.000364445098834350.4806222.01812·1092.01812·10964.806225.00008·10975.00008·1097748.06226.68858·102226.68858·102228480.622-94806.221048062.2Наиболее точные значения производных получены при шаге h порядка 〖10〗^(-8)- 〖10〗^(-3).
Недопустимо большая погрешность вычислений наблюдается при шагах h>0.1, она растёт с увеличением шага, это связано с методической погрешностью. При h<〖10〗^(-8) также можно отметить большую погрешность, которая растёт с уменьшением шага, это связано с вычислительной погрешностью.
Приложение 1 (к заданию 1)
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
double fi(double x)
{
return pow(2.435*cos(x), 1/134.0);
}
int main()
{
cout.precision (5);
cout.setf (ios::fixed, ios::floatfield);
const double q = 0.1, epsilon = 0.00001;
double x_n = 0.5;
double temp;
int i = 1;
do{
temp = x_n;
x_n = fi(x_n);
cout << i++ << " " << x_n << " " << 1/(1-q)*fabs(x_n-temp) << endl;
} while(1/(1-q)*fabs(x_n-temp)>epsilon);
cout.precision(5);
cout << "x = " << x_n << "+/-" << epsilon << endl;
system("PAUSE");
return 0; }
Приложение 2 (к заданию 2)
#include <iostream>
#include <math.h>
using namespace std;
int main ()
{
setlocale(LC_ALL,".1251");
cout.precision (4);
cout.setf (ios::fixed);
float e = (float)0.001;
float x;
float a = (float)0.6, b = (float)1.;
float c;
//Метод половинного деления
cout << "Метод половинного деления:" << endl;
int i=0;
while (fabs (a-b) >= e)
{
cout << i << ' ' << a << ' ' << b << ' ' << fabs(a-b) << endl;
c = (a+b)/2;
if ((tan (2.79*a) + 3*a)*(tan (2.79*c) + 3*c) < 0.)
b = c;
else
a = c;
i++;
}
cout << i << ' ' << a << ' ' << b << ' ' << fabs(a-b) << endl;
x = (a+b)/2;
cout << x << endl;
//Метод Ньютона
cout << "Метод Ньютона:" << endl;
float xn, xn1 = (float)0.6;
xn = xn1 - (tan (2.79*xn1) + 3.*xn1)/(2.79/(cos (xn1*2.79)*cos (xn1*2.79))+3.);
i = 1;
while (fabs (xn-xn1) >= e)
{
cout << i << ' ' << xn << ' ' << fabs (xn-xn1) << endl;
xn1 = xn;
xn = xn1 - (tan (2.79*xn1) + 3.*xn1)/(2.79/(cos (xn1*2.79)*cos (xn1*2.79))+3.);
i++;
}
cout << i << ' ' << xn <<' ' << fabs (xn-xn1) << endl;
cout << xn1 << endl;
//Метод хорд
cout << "Метод хорд:" << endl;
float xn2;
xn = (float)0.6;
xn1 = (float)0.7;
xn2 = xn1 - (tan (2.79*xn1) + 3.*xn1)*(xn1 - xn)/((tan (2.79*xn1) + 3.*xn1)-(tan (2.79*xn) + 3.*xn));
i = 2;
while (fabs (xn2-xn1) >= e)
{
cout << i << ' ' << xn2 <<' ' <<fabs (xn2-xn1) << endl;
xn = xn1;
xn1 = xn2;
xn2 = xn1 - (tan (2.79*xn1) + 3.*xn1)*(xn1 - xn)/((tan (2.79*xn1) + 3.*xn1)-(tan (2.79*xn) + 3.*xn));
i++;
}
cout << i << ' ' << xn2 <<' ' <<fabs (xn2-xn1)<< endl;
cout << xn2 << endl;
system("PAUSE");
return 0;
}
Приложение 3 (к заданию 6)
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
double f(double x) { return sqrt(x)*sin(x); }
double rect_left(double a, double b, int n)
{
double h=(b-a)/n;
double s = 0.0;
for(int i=0; i<n; i++)
s+=f(a+i*h);
s*=h;
return s;
}
double rect_right(double a, double b, int n)
{
double h=(b-a)/n;
double s = 0.0;
for(int i=1; i<=n; i++)
s+=f(a+i*h);
s*=h;
return s;
}
double rect_mid(double a, double b, int n)
{
double h=(b-a)/n;
double s = 0.0;
for(int i=0; i<n; i++)
s+=f((a+i*h + a+(i+1)*h)/2.0);
s*=h;
return s;
}
double trap(double a, double b, int n)
{
double h=(b-a)/n;
double s = 0.0;
for(int i=0; i<n; i++)
s+= (f(a+i*h) + f(a+(i+1)*h));
s*=h/2.0;
return s;
}
double simpson(double a, double b, int n)
{
double h=(b-a)/n;
double s = f(a);
for(int i=1; i<n; i++)
s+=2*f(a+i*h);
for(int i=1; i<=n; i++)
s+= 4.0*f((a+(i-1)*h+a+(i)*h)/2);
s+=f(b);
s*=h/6.0;
return s;
}
int main()
{
setlocale(LC_ALL,".1251");
cout.precision(7);
cout.setf(ios::fixed,ios::floatfield);
cout << "Метод левых прямоугольников:" << " " << rect_left(0, 1, 12) << " " << rect_left(0, 1, 24) << " " <<
1/3.0*fabs(rect_left(0, 1, 12)-rect_left(0, 1, 24)) << endl;
cout << "Метод правых прямоугольников:" << " " << rect_right(0, 1, 12) << " " << rect_right(0, 1, 24) << " " <<
1/3.0*fabs(rect_right(0, 1, 12)-rect_right(0, 1, 24)) << endl;
cout << "Метод средних прямоугольников:" << " " << rect_mid(0, 1, 12) << " " << rect_mid(0, 1, 24) << " " <<
1/3.0*fabs(rect_mid(0, 1, 12)-rect_mid(0, 1, 24)) << endl;
cout << "Метод трапеций:" << " " << trap(0, 1, 12) << " " << trap(0, 1, 24) << " " <<
1/3.0*fabs(trap(0, 1, 12)-trap(0, 1, 24)) << endl;
cout << "Метод Симпсона:" << " "<< simpson(0, 1, 12) << " " << simpson(0, 1, 24) << " " <<
1/15.0*fabs(simpson(0, 1, 12)-simpson(0, 1, 24)) << endl;
system("PAUSE");
return 0;
}
Приложение 4 (к заданию 11)
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
double f(double x)
{
return (pow(x/2.0, 134.0) - 2.435*cos(x/2.0))/10000000000000.0;
}
double f_p(double x)
{
return (67.0*pow(x/2.0, 133.0) + 2.435/2.0*sin(x/2.0))/10000000000000.0;
}
double metod_newtona(double x0, double eps)
{
const double epsilon = eps;
double x_n = x0;
double temp;
int i = 1;
do{
temp = x_n;
x_n = x_n - f(x_n)/f_p(x_n);
cout << i++ << '\t' << x_n << '\t' << fabs(x_n-temp) << endl;
} while(fabs(x_n-temp)>=epsilon);
cout << "x = " << x_n << "+/-" << epsilon << endl;
return x_n;
}
void metod_sek(double x0, double x1, double eps)
{
const double epsilon = eps;
double x_n = x1;
double pred = x0;
double predpred;
int i = 2;
do{
predpred = pred;
pred = x_n;
x_n = pred - f(pred)*(pred - predpred)/(f(pred)- f(predpred));
cout << i++ << '\t' << x_n << '\t' << fabs(x_n-pred) << endl;
} while(fabs(x_n-pred)>epsilon);
cout << "x = " << x_n << "+/-" << epsilon << endl;
}
void metod_stef(double x0, double eps)
{
const double epsilon = eps;
double x_n = x0;
double pred;
int i = 1;
do{
pred = x_n;
x_n = x_n - f(x_n)*f(x_n)/(f(x_n+f(x_n))-f(x_n));
cout << i++ << '\t' << x_n << '\t' << fabs(x_n-pred) << endl;
} while(fabs(x_n-pred)>epsilon);
cout << "x = " << x_n << "+/-" << epsilon << endl;
}
int main()
{
setlocale(LC_ALL,".1251");
cout.precision(4);
cout.setf(ios::fixed,ios::floatfield);
cout << "Метод Ньютона:\n";
metod_newtona(2.1, 0.001);
cout << "Метод секущих:\n";
metod_sek(2.05, 2.1, 0.001);
cout << "Метод Стефенсена:\n";
metod_stef(2.1, 0.001);
system("PAUSE");
return 0;
}
Приложение 5 (к заданию 13)
#include <iostream>
#include <math.h>
using namespace std;
double F(double arg),
Derivative(double arg),
MachineFault = 0.5,
Fault = 0.,
Temp = 1.;
int iCount,
jCount;
int main ()
{
setlocale(LC_ALL,".1251");
cout.precision (18);
cout.setf (ios::fixed);
while (MachineFault + 1. > 1.)
{
MachineFault = MachineFault/2.;
}
MachineFault = MachineFault*2.;
cout << "Эпсилон машинная = " << MachineFault << endl;
double Factor[6] = { -528.616, 875.7544, -519.90634, 144.78772, -19.32154, 1.0 };
double DerivativeFactor[5] = { 875.7544, -1039.81268, 434.36316, -77.28616, 5.0 };
cout << "x = 1.32154" << endl;
double V [6];
double Root = (double)1.32154;
for (iCount=0; iCount<6; iCount++)
{
for (jCount=0; jCount<iCount; jCount++)
Temp = Temp*Root;
V[iCount] = fabs(2.*Temp*Factor[iCount])/fabs(5.*Factor[5]*pow(Root, 4) + 4.*Factor[4]*pow(Root, 3) + 3.*Factor[3]*pow(Root, 2) + 2.*Factor[2]*Root + Factor[1]);
cout << iCount << " " << V[iCount] << endl;
}
for (iCount=0; iCount<6; iCount++)
{
Fault += fabs(V[iCount]*MachineFault);
}
Fault = Fault*Root;
cout << "Погрешность = " << Fault << endl;
cout << "x = 4" << endl;
double V1 [5];
double Root1 = 4 ;
for (iCount=0; iCount<5; iCount++)
{
for (jCount=0; jCount<iCount; jCount++)
Temp = Temp*Root1;
V1[iCount] = fabs(2.*Temp*Factor[iCount])/fabs(5.*Factor[5]*pow(Root1, 4) + 4.*Factor[4]*pow(Root1, 3) + 3.*Factor[3]*pow(Root1, 2) + 2.*Factor[2]*Root1 + Factor[1]);
cout << iCount << " " << V1[iCount] << endl;
}
for (iCount=0; iCount<6; iCount++)
{
Fault += fabs(V1[iCount]*MachineFault);
}
Fault = Fault*Root1;
cout << "Погрешность = " << Fault << endl;
cout << "x = 5" << endl;
double V2 [5];
double Root2 = 5;
for (iCount=0; iCount<5; iCount++)
{
for (int jCount=0; jCount<iCount; jCount++)
Temp = Temp*Root2;
V2[iCount] = Temp*fabs(DerivativeFactor[iCount])/fabs(4.*DerivativeFactor[4]*pow(Root2, 3) + 3.*DerivativeFactor[3]*pow(Root2, 2) + 2.*DerivativeFactor[2]*Root2 + DerivativeFactor[1])/Root2;
cout << iCount << " " << V2[iCount] << endl;
}
Fault = 0.;
for (iCount=0; iCount<6; iCount++)
{
Fault += fabs(V2[iCount]*MachineFault);
}
Fault = Fault*Root2;
cout << "Погрешность = " << Fault << endl;
cout << "Поиск методом Ньютона:" << endl;
cout << "Простой корень1:" << endl;
double Xn1 = (double)1., Xn;
double Epsilon = MachineFault*1.32154;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount=0;
while (fabs (Xn-Xn1) >= Epsilon)
{
cout << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
Xn1 = Xn;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount++;
}
cout << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
cout << "x1 = " << Xn1 << "+-" << 1.32154 - Xn << endl;
cout << "Первый кратный корень:" << endl;
Xn1 = (double)4.1;
Epsilon = MachineFault*4.;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount=0;
while (fabs (Xn-Xn1) >= Epsilon)
{
cout << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
Xn1 = Xn;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount++;
}
cout << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
cout << "x2,3 = "<< Xn << "+-" << 4 - Xn << endl;
cout << "Второй кратный корень:" << endl;
Xn1 = (double)5.3;
Epsilon = MachineFault*5.;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount=0;
while (fabs (Xn-Xn1) >= Epsilon)
{
cout << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
Xn1 = Xn;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount++;
}
cout << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
cout << "x4,5 = "<< Xn << "+-" << 5 - Xn << endl;
system("PAUSE");
return 0;
}
double F(double arg)
{
return pow(arg, 5.0) - 19.32154*pow(arg, 4.0) +
144.78772*pow(arg, 3.0) - 519.90634*pow(arg, 2.0) +
875.7544*arg-528.616;
}
double Derivative(double arg)
{
return 5*pow(arg, 4.0) - 77.28616*pow(arg, 3.0) + 434.36316*pow(arg, 2.0) - 1039.81268*arg + 875.7544;
}
Приложение 6 (к заданию 14)
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
double f(double x)
{
return pow(x, 134.0) - 2.435*cos(x);
}
double f_d(double x)
{
return 134.0*pow(x, 133.0) + 2.435*sin(x);
}
double f_dd(double x)
{
return 134.0*133.0*pow(x, 132.0) + 2.435*cos(x);
}
double mach_eps()
{
double e,e1;
int k=0;
e=1.0;
do {
e=e/2.0;
e1=e+1.0;
k++;
} while (e1>1.0);
return e;
}
int main()
{
setlocale(LC_ALL,".1251");
const double x=0.68;
double e=mach_eps();
for(int k=-10; k<=10; k++)
{
double h = pow(10, (double)k)*pow(e, 1/3.0);
double fd = (f(x+h)-f(x-h))/2.0/h;
cout << "k = " << k << endl;
cout << "h = " << h << endl;
cout << "Первая производная по разностному = " << fd << " || Погрешность: " << fabs(fd-f_d(x)) << endl;
}
cout << "====================================\n";
for(int k=-10; k<=10; k++)
{
double h = pow(10, (double)k)*pow(e, 1/3.0);
double fdd = (f(x-h)- 2*f(x)+f(x+h))/h/h;
cout << "k = " << k << endl;
cout << "h = " << h << endl;
cout << "Вторая производная по разностному = " << fdd << " || Погрешность: " << fabs(fdd-f_dd(x)) << endl;
}
system("PAUSE");
return 0;
}
Документ
Категория
Рефераты
Просмотров
48
Размер файла
104 Кб
Теги
фрейман, готовый, курсовик
1/--страниц
Пожаловаться на содержимое документа