close

Вход

Забыли?

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

?

КУРСОВИК (Митрофанов)

код для вставкиСкачать
Министерство образования и науки Российской Федерации
Государственное образовательное учреждение высшего профессионального образования
"Новгородский государственный университет имени Ярослава Мудрого"
(НовГУ)
Институт электронных и информационных систем
Кафедра прикладной математики и информатики
КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ "ЧИСЛЕННЫЕ МЕТОДЫ" Выполнил:
студент группы 0311
___________М. В. Митрофанов
" ___"_____________2013 г.
Проверил:
к. ф.- м .н., доцент
_____________Т.В. Жгун
" ___"_____________2013 г.
ВАРИАНТ 6
номерФамилия1,14234567Лабор. работа13mN функ.x.N примераN примераN примераN функцииN примера6634,263866
1 ЗАДАНИЕ №1
Задание
Найти корни уравнения f(x) = 0 методом итераций с точностью ε=10-5 .
f(x) = x317 - sin3 x 1.2 ИДЕЯ МЕТОДА ПРОСТЫХ ИТЕРАЦИЙ
Представим функцию f(x)=0 в виде x = φ(x). На каждом шаге x(n) = φ (x(n-1)). Значение x(n) постепенно приближается к корню уравнения f(x)=0.
1.3 ПОСТРОЕНИЕ ИТЕРАЦИОННОЙ ФУНКЦИИ
Преобразуем выражение , значит,
- искомая итерационная функция
1.4 ГРАФИК ФУНКЦИИ
Рисунок 1.1 - График функции f(x)
1.5 РЕШЕНИЕ
Заданная функция является четной, поэтому будем искать только положительные корни. На рисунке 1.1 представлен график функции f(x).
В качестве отрезка локализации корня можно взять отрезок [0.85, 0.95]. Требуемая точность будет достигнута, когда 1/(1-q)|x^((n) )-x^((n-1) ) |<ε, где q=max┬(x∈[0.85, 0.95])⁡〖|φ^' (x)|〗. В нашем примере (317∙∛x^317)/(3∙x∙√(1-(〖∛(x^317 ))〗^2 ))
Положительная возрастающая функция на отрезке локализации, следовательно, она достигает максимума в правой границе отрезка: q=|φ^' (0.95)|≈0.5
Таблица 1 - Поиск корня уравнения методом простых итераций.
nx(n-1)x(n)10.950000.004431.8911520.004430.000000.0088530.000000.000000.00000
ВЫВОД
С помощью метода простых итераций за 3 шага был найден корень уравнения f(x)=0, полученный корень: x = 0.00000±0.00001
ЗАДАНИЕ №3
Задание
Функция задана таблично. Вычислить значения функции с точностью ε = 10-3 с помощью интерполяционного многочлена Лагранжа. Оценить погрешность вычислений, погрешность метода, суммарную погрешность.
0,00 0,08 0,13 0,20 0,27 0,31 0,38 0,441,000001,725391,976641,929501,454741,073070,426870,09338 .
Идея метода
В общем случае будем заменять функцию f(x) полиномом степени n Pn(x) = a0 + a1 x + a2 x2 + ... + an xn
совпадающим с функцией f(x) в n+1 табличных точках xi , называемых узлами интерполяции a0 + a1 xi + a2 xi2 + ... + an xin = f(xi), i=0,1,2,...n. (1)
Система уравнений (1) может быть решена, если среди узлов xi нет совпадающих. Используя решение этой системы интерполяционный полином можно записать в виде полинома Лагранжа
В нашем случае будем интерполировать функцию полиномом Лагранжа 2 степени, для точек №1, 2 и 3.
1,00000∙(x-0,08)∙(x-0.13)/ 0,0104+1,72539∙x∙(x-0,13)/(- 0,004)+1,97664∙x(x-0,08)/ 0,0065=107.118∙x^2+11.555∙x+1.000
Оценка погрешности метода
Ошибка приближения функции интерполяционным полиномом это разность Rn(x) = f(x) - Pn(x), где
, Приближенно найдем третью производную функции, заменив полином Лагранжа третьей степени. Тогда третья производная постоянна и равна старшему члену полинома Лагранжа третьей степени, умноженному на 3!.
|f( )-L2( )|<1/3!∙()∙max|(f(x)|
()=-0.0000769
f"'=2/x^3
|f( )-L2( )|< 1/3!∙ ()∙max|(f(x)|= 1.907
Оценка погрешности вычислений.
Пусть ε = 0.00001 - погрешность исходных данных, тогда |f(x)-L(x)|=0.005
Вывод.
С помощью метода интерполяции полиномами Лагранжа было получено приближенное значение функции в точке .
f(x) = 1.907±0.005
3. ЗАДАНИЕ №4
3.1. Задание
С точностью ε = 10-3 найти наименьший положительный корень уравнения f(x) = 0.
Методом половинного деления
Методом Ньютона
Методом хорд
Результаты занести в таблицу.
3.2. ИССЛЕДОВАНИЕ ЗАДАЧИ
Построив график функции f(x) (Рис. 3.1), находим, что наименьший положительный корень уравнения f(x)=0 находится на промежутке [0,85, 0,89]. Все методы будем применять для поиска корня именно на этом промежутке.
Рисунок 3.1. График функции f(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] и повторяем это до тех пор пока получаемый отрезок не сожмется до заданной степени точности. Идея метода Ньютона
Зададим некоторое начальное приближение x0 [a,b] и линеаризуем функцию f(x) в окрестности x0 с помощью отрезка ряда Тейлора f(x) = f(x0) + f '(x0) (x-x0).
Решим линеаризованное уравнение f(x0) + f '(x0)(x-x0) = 0, трактуя его решение x как первое приближение к корню
x1 = x0 - f(x0)/f '(x0) .
Продолжая этот процесс, приходим к формуле Ньютона
,
которую можно считать итерационным процессом с итерирующей функцией s(x) = x - f(x)/f '(x).
Идея метода хорд
Этот метод можно получить из метода Ньютона, заменив производную f '(x) отношением разности функции к разности аргумента в окрестности рассматриваемой точки
f '(x) ≈ ( f(x+h) - f(x))/h.
Геометрически это означает, что приближенным значением корня считается точка пересечения секущей, проходящей через две точки функции f(x(n)) и f(x(n-1)), с осью абсцисс.
Таблица 3.1 - Нахождение корня уравнения методом половинного деления
nab|a-b|00.850000.890000.0400010.870000.890000.0200020.880000.890000.0100030.885000.890000.0050040.887500.890000.0025050.888750.890000.0012560.889370.890000.00063
Таблица 3.2 - Нахождение корня уравнения методом Ньютона
nx(n)|x(n)-x(n-1)|00.855340.0053410.865600.0102620.884470.0188730.916140.0316640.959610.0434750.998530.0389261.013710.0151871.015090.0013881.015100.00001
Таблица 3.3 - Нахождение корня уравнения методом хорд
nx(n)|x(n)-x(n-1)|00.894230.0042310.927790.0335620.954910.0271330.986100.0311841.005840.0197551.013730.0078961.015030.0013071.015100.00006
3.3. ВЫВОД
Наименьший положительный корень уравнения f(x)=0 x = 0.889±0,001. Метод половинного деления оказался самым достоверным методом.
5. ЗАДАНИЕ №6
5.1. Задание
Вычислить определённый интеграл с помощью формул:
-трапеций;
-Симпсона;
-прямоугольников (3 шт.) с числом узлов .
Оценить погрешность по формуле Рунге.
5.2 ФОРМУЛА ТРАПЕЦИЙ
где -величина шага, а - узлы интегрирования
5.3 ФОРМУЛА СИМПСОНА
где -величина шага, а - узлы интегрирования
5.4 ФОРМУЛА ПРЯМОУГОЛЬНИКОВ
Формула левых прямоугольников
Формула правых прямоугольников:
Формула средних прямоугольников:
Везде выше -величина шага, а - узлы интегрирования
5.5. ОЦЕНКА ПОГРЕШНОСТИ КВАДРАТУРНЫХ ФОРМУЛ. ПРАВИЛО РУНГЕ.
Для оценки погрешности R квадратурной формулы для непрерывной на [a, b] функции f(x), можно использовать правило Рунге: вычислить по соответствующей квадратурной формуле с шагом h=(b-a)/n и с шагом h/2 значения Ik и Ik/2, и найти приближенное значение интеграла и оценку погрешности по формулам: - для формулы прямоугольников; - для формулы трапеций; - для формулы Симпсона.
5.5 РЕЗУЛЬТАТ
В таблице 5.1 представлен результат выполнения программы (см. приложение 3), реализующей изложенные выше методы численного интегрирования для заданной функции. Таблица 5.1 - Результат численного интегрирования
In (n = 12)
In/2 (n = 24)
I
RМетод правых прямоугольников0.8197400.8002720.8067610.006489Метод левых прямоугольников0.7364070.7586050.7660050.007400Метод средних прямоугольников0.7808040.7357010.7507350.015035Метод трапеций0.7780730.7794390.7789840.000455Метод Симпсона0.7799020.7798940.7798930.000001
5.6 ВЫВОД
Искомый определенный интеграл у меня получился равным:
I ≈ 0.807±0.006 - по методу правых прямоугольников
I ≈ 0.766±0.007 - по методу левых прямоугольников
I ≈ 0.751±0.015 - по методу средних прямоугольников
I ≈ 0.7790±0.0005 - по методу трапеций
I ≈ 0.779902±0.000001- по методу Симпсона
Как видно, наименее точным из этих методов является метод средних прямоугольников, наиболее точным - метод Симпсона.
6. ЗАДАНИЕ №7
6.1. Задание
Вычислить интеграл по формуле Гаусса и оценить погрешность для :
6.2 ОПИСАНИЕ МЕТОДА РЕШЕНИЯ ЗАДАЧИ
Квадратурная формула Гаусса:
где - корни полинома Лежандра;
- веса, вычисляемые по формуле
;
Для случая нули полинома Лежандра и соответствующие веса представлены в таблице 6.1.
Таблица 6.1 - Нули полинома Лежандра 4-й степени и соответствующие веса
-0.3399810.6521451-0.8611360.34785480.8611360.34785480.3399810.6521451
Воспользовавшись формулой Гаусса, найдем, что искомый интеграл равен
6.3 ОЦЕНКА ПОГРЕШНОСТИ
Остаточный член формулы Гаусса для n=4 выражается следующим образом:
, Найдена десятая производная . Она получилась равной .
Искомый интеграл получился равным: 6.4 ВЫВОД
Данный метод оказался очень точным
7. ЗАДАНИЕ №8
7.1. Задание
Сравнить работу различных модификаций метода Ньютона для фиксированного =6 нахождения корня функции, а именно: - модифицированный метод Ньютона;
- метод ложного положения;
- метод секущих;
- метод Стефенсона.
Результаты занести в таблицу. Функция x317 - sin3 x = 0.
ИДЕЯ МЕТОДОВ
7.2 МОДИФИЦИРОВАННЫЙ МЕТОД НЬЮТОНА.
Метод такой же, как и описанный выше в задании 3, только , n = 0, 1, ..., а x0 - начальная итерация.
7.3 МЕТОД ЛОЖНОГО ПОЛОЖЕНИЯ.
Метод, основанный на нахождении xi+1 по двум предыдущим приближениям xi и xi-1 с помощью линейной интерполяции, называется методом хорд. Идея метода состоит в том, что по двум точкам Mi-1(xi-1, f(xi-1)) и Mi(xi, f(xi)) построить прямую Mi-1Mi (то есть хорду, соединяющую две точки графика y=f(x)) и взять в качестве следующего приближения xi+1 абсциссу точки пересечения этой прямой с осью Ox. Иными словами, приближённо заменить на этом шаге функцию f(x) её линейной интерполяцией, найденной по двум значениям x: xi и xi-1. Интерполяционную линейную функцию будем искать как функцию с угловым коэффициентом, равным разностному отношению
,
построенному для отрезка между xi и xi-1, график которой проходит через точку Mi: Решая уравнение, находим , то есть .
7.4 МЕТОД СЕКУЩИХ.
Пусть на отрезке [a, b] существует единственный корень уравнения: x* и f(x*)=0, а f'(x) существует, непрерывна и отлична от нуля на [a, b]. Перепишем уравнение следующим образом: и применим к этому выражению формулу Лагранжа: , .
Заменим на , а - на и получим формулу итерационного процесса: .
Выразим отсюда : .
Заменим разностным приближением: .
В результате получим формулу итерационного процесса: , k = 1, 2...
Метод секущих является двухшаговым, то есть новое приближение определяется двумя предыдущими итерациями и . В методе необходимо задавать два начальных приближения и .
7.5 МЕТОД СТЕФЕНСОНА.
Заменим f'(xn) в методе секущих на выражение
.
В выражение входит еще не найденное значение . Вычислим
его, применив алгоритм простой итерации:
.
В результате мы получим аппроксимацию
,
использование которой в методе Ньютона приводит к новому
итерационному алгоритму
,
известному в численном анализе как метод Стефенсона.
Метод Стефенсона имеет квадратичную сходимость, но высокая
скорость сходимости достигается за счет дополнительного вычисления
значения . На каждой итерации метод требует двух
вычислений функции. По этому критерию метод Стефенсона менее
эффективен, чем метод секущих.
Метод ложных положенийnx(n)числоВЗЦзначение функции00.940000000000002-0.5266490812189710.4541141286724414-0.0844117890734720.2914010196705314-0.0237127414368730.1914212841781414-0.0068865896032740.1268232526363214-0.0020234951208350.0843207181726214-0.0005973909115460.0561470089078714-0.0001767238849270.0374116474743214-0.0000523258822980.0249352769998614-0.0000154991390090.0166217949093314-0.00000459170273100.0110806862901514-0.00000136042097110.0073869730188414-0.00000040307670120.0049246038907314-0.00000011942868130.0032830559903414-0.00000003538609140.0021887000617414-0.00000001048474150.0014591322095114-0.00000000310659160.0009727544611714-0.00000000092047170.0006485028718414-0.00000000027273180.0004323352175914-0.00000000008081190.0002882234694114-0.00000000002394200.0001921489769514-0.00000000000709210.0001280993171814-0.00000000000210220.0000853995445514-0.00000000000062230.0000569330296314-0.00000000000018240.0000379553530714-0.00000000000005250.0000253035687114-0.00000000000002
Модифицированный метод Ньютона за 1103 шага нашел корень x=0.02212021854852 f(x)= -0.00001083554038
Метод секущихnx(n)числоВЗЦзначение функции00.940000000000002-0.5266490812189710.950000000000002-0.5381920387337420.4837485752288114-0.1006100843689530.3765467248886514-0.0497188453057140.2718145094492414-0.0193523937496650.2050691714990414-0.0084441613520860.1534010017527314-0.0035675551281770.1156023697783914-0.0015346063160580.0870694234395314-0.0006575826985990.0656757329175214-0.00028266889935100.0495458092789814-0.00012147521762110.0373903329406514-0.00005223654002120.0282197356928214-0.00002246393816130.0213003629611714-0.00000966189891140.0160782043193214-0.00000415581776150.0121366823825814-0.00000178759024160.0091615349126114-0.00000076892945170.0069157642332414-0.00000033075784180.0052205237146114-0.00000014227752190.0039408430253314-0.00000006120178200.0029748484382614-0.00000002632647210.0022456440998114-0.00000001132457220.0016951854783914-0.00000000487137230.0012796571860814-0.00000000209547240.0009659844270214-0.00000000090138250.0007291999825814-0.00000000038774260.0005504567434914-0.00000000016679270.0004155274857314-0.00000000007175280.0003136724117414-0.00000000003086290.0002367842951514-0.00000000001328300.0001787431748414-0.00000000000571310.0001349292301314-0.00000000000246320.0001018550621114-0.00000000000106330.0000768881114814-0.00000000000045340.0000580411181114-0.00000000000020350.0000438139437714-0.00000000000008360.0000330741676114-0.00000000000004Метод Стефенсонаnx(n)числоВЗЦзначение функции00.940000000000002-0.5266490812189710.950000000000002-0.5381920387337420.3390049938603514-0.0367761676537030.2090337306856214-0.0089360787241340.1353247071777114-0.0024555698306450.0891181718455314-0.0007049750644760.0590979246220614-0.0002060431592170.0393069299212214-0.0000606836725280.0261776348523814-0.0000179325648090.0174437846285114-0.00000530708535100.0116268307965714-0.00000157164589110.0077505219887114-0.00000046556445120.0051668077372514-0.00000013793075130.0034444771883814-0.00000004086649140.0022962999626314-0.00000001210834150.0015308612602814-0.00000000358762160.0010205725790314-0.00000000106300170.0006803812469013-0.00000000031496180.0004535873579414-0.00000000009332190.0003023915305114-0.00000000002765200.0002015943411914-0.00000000000819210.0001343962237214-0.00000000000243220.0000895974814714-0.00000000000072230.0000597316540114-0.00000000000021240.0000398211023714-0.00000000000006250.0000265474016013-0.00000000000002
7.6 ВЫВОД
Модифицированный метод Ньютона оказался самым неэффективным методом. Наиболее эффективными в этой задаче оказались метод ложных положений и метод Стефенсона. В действительности модифицированный метод Ньютона имеет маленькую скорость сходимости, он обладает локальной сходимостью.
8. ЗАДАНИЕ №13
8.1. Задание
Вычислить коэффициенты обусловленности корней полинома пятой степени в зависимости от коэффициентов полинома a priori и a posteori, то есть теоретически и вычислив корни полинома с помощью приближенных методов по формуле Ньютона. Покажите, что для кратных и простых корней метод имеет различную скорость сходимости Коэффициенты уравнения вещественны и заданы с точностью , которая должна быть предварительно подсчитана. Ответ- 30 штук значений для коэффициентов обусловленности!!!!! 8.2. АПРИОРНАЯ ОЦЕНКА ПОГРЕШНОСТИ
Вычислим корни уравнения. Они равны:
x1 = -12 - корень первой кратности,
x2,3,4,5= 3.72225 - корень четвертой кратности.
Сначала найдем коэффициенты обусловленности для корня первой кратности. Раскроем в уравнении скобки и получим:
Рассмотрим неявно заданную функцию:
, где:
xk - один из корней уравнения;
- коэффициенты уравнения.
Тогда i-ый корень будет определяться через коэффициенты:
Погрешность функции многих переменных определяем по формуле: , где:
νi - коэффициент обусловленности;
δai - относительная погрешность коэффициента (равна машинной точности).
Найдем производную неявной функции :
Тогда:
Найдем коэффициенты обусловленности для корня x1 = -12:
Таким образом, Теперь найдем коэффициенты обусловленности для корней четвертой кратности.
Для кратного корня x2=x3=x4=x5=3.72225 коэффициент обусловленности будет стремиться к бесконечности, так как эти корни будут простыми корнями уравнения f'x=0. Найдем обусловленность кратного корня x2=x3=x4=x5=3.72225. Необходимо отметить, что погрешность входных данных теперь 2εм, так как коэффициенты представляют собой произведения первоначальных коэффициентов и степеней, которые ранее были представлены с точностью εм.
Рассмотрим неявную функцию:
где: - коэффициенты уравнения, а xi является одним из корней уравнения. Тогда i-ый корень будет определяться через коэффициенты: .
Погрешность функции можно определить по формуле:
где:
ν_i - коэффициент обусловленности, δa_i - относительная погрешность коэффициента:
.
Найдем производную неявной функции:
.
Тогда:
Найдем коэффициенты обусловленности для корня x2,3,4,5 =3,72225:
Таким образом, 8.4. ОПРЕДЕЛЕНИЕ КОРНЕЙ ПРИ ПОМОЩИ МЕТОДА НЬЮТОНА
Зададим некоторое начальное приближение 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))),
которую можно считать итерационным процессом с итерирующей функцией s(x)=x-(f(x))/(f^' (x)).
Таблица. Определение корней при помощи метода Ньютона.
Точное значение корняНачальное приближениеПриближенное значение корняЧисло итерацийФактическая погрешность-12-13-12.00000000000000000060.0000000000000000003.722253.53.7222499999999981001130.000000000000001776
8.5 ВЫВОД
Как видно из решения, скорость сходимости метода Ньютона-Рафсона резко снижается при нахождении кратных корней. 9. ЗАДАНИЕ №14
9.1. Задание
Вычислить приближённые значения производных (первой и второй) для функции x317 - sin3 x = 0 в точке x=0.68.
Первую производную будем аппроксимировать центральным разностным отношением, а для второй производной используем формулу (а) Найти приближение к первой производной по указанному правилу. Использовать формулу центрального разностного отношения для значений , где k = -10, -9, -2, -1, 0, 1, 2, 9, 10.
(б) Вычислить приближение для второй производной. Шаг тот же. В каждом случае сравнить вычисленные приближения с истинными значениями производных. (в) Использовать технику экстраполяции, чтобы улучшить приближения, полученные в пунктах (а) и (б).
(г) Сделать выводы, проанализировав погрешность вычислений. Результаты оформить в таблице, сравнив точные и приближенные значения производных, а также полученную ошибку. Привести график ошибки в зависимости от k.
9.2. ОПИСАНИЕ МЕТОДА РЕШЕНИЯ ЗАДАЧИ
Для вычисления первой производной в точке x воспользуемся центральным разностным соотношением:
, где , k = -10, -9,........ -2, -1, 0, 1, 2, 9, 10.
Для вычисления второй производной в точке x воспользуемся формулой
,
которая получается, если дважды применить формулу центрального разностного соотношения.
Значение производных данной функции:
f'(0.68)= -0.9999
f''(0.68)= 9.3 ПРИБЛИЖЕННОЕ ВЫЧИСЛЕНИЕ ПРОИЗВОДНОЙ
khf'(x)Точное значениеΔ f'(x)-100.00000000000000005-0.02728484105318783 -0.99990.97271515894681171-90.00000000000000048-0.93405105872079663 0.06594894127920292-80.00000000000000477-1.001444616122170600.00144461612217106-70.00000000000004768-0.998870746116153230.00112925388384633-60.00000000000047684-1.000010342977474700.00001034297747515-50.00000000000476837-1.000007887341779900.00000788734178037-40.00000000004768372-1.000000656858900800.00000065685890127-30.00000000047683716-0.99999993381061290.00000006618938664-20.00000000476837158-1.00000000120417030.00000000120417076-10.00000004768371582-1.000000000958606700.0000000009586071900.00000047683715820-1.000000000002727800.0000000000027282610.00000476837158203-1.000000000000272200.0000000000002726720.00004768371582031-1.000000000000026000.0000000000000264230.00047683715820313-1.000000000000001800.0000000000000022240.00476837158203125-0.999999999999999440.0000000000000001150.04768371582031254-0.999999999999965470.0000000000000340860.47683715820312533очень большое числоочень большое число74.76837158203125360очень большое числоочень большое число847.68371582031252800очень большое числоочень большое число9476.83715820312534000очень большое числоочень большое число104768.37158203125270000очень большое числоочень большое числоkhf''(x)Точное значениеΔ f''(x)-100.000000000000000051144409179687498.50000000000000000 1144409179687498.50000000000000000-90.0000000000000004811444091796874.98400000000000000 11444091796874.98400000000000000-80.00000000000000477114440917968.74985000000000000 114440917968.74985000000000000-70.000000000000047681144409179.68749860000000000 1144409179.68749860000000000-60.0000000000004768411444091.79687498700000000 11444091.79687498700000000-50.00000000000476837114440.91796874984000000 1533031.6956023476000-40.00000000004768372-2932.5485229492142000 114440.91796874984000000-30.000000000476837161144.40917968749820000 1144.40917968749820000-20.0000000047683715811.44409179687498400 11.44409179687492200-10.000000047683715820.11444091796874983 0.1144409179686878700.000000476837158200.00114440917968750 0.0011444091796255310.000004768371582030.00001144409179687 0.0000114440917349120.000047683715820310.00000011444091797 0.0000001144408560030.000476837158203130.00000000112056732 0.0000000011205053540.004768371582031250.00000000001049042 0.0000000000104284550.047683715820312540.00000000000005484 0.0000000000000071360.476837158203125330.00000000000141602 0.0000000000013540574.76837158203125360очень большое числоочень большое число847.68371582031252800очень большое числоочень большое число9476.83715820312534000очень большое числоочень большое число104768.37158203125270000очень большое числоочень большое число
9.4 ВЫВОД
Наиболее точные значения производных получены при шаге порядка 〖10〗^(-3)- 〖10〗^(-2).
Недопустимо большая погрешность вычислений наблюдается при шагах h>0.1, она растёт с увеличением шага, это связано с методической погрешностью. При h<〖10〗^(-3) также можно отметить большую погрешность, которая растёт с уменьшением шага, это связано с вычислительной погрешностью.
Приложение 1 (к заданию 1)
#include <iostream>
#include <clocale>
#include <cmath>
#include <fstream>
#include <cstdlib>
using namespace std;
const double pi=3.141592653589;
double fi(double x)
{
return asin(pow(x,317./3.));
}
int main()
{
ofstream out ("zadanie№1.txt");
out.precision (5);
out.setf (ios::fixed, ios::floatfield);
const double q = 0.50000, epsilon = 0.00001;
double x_n = 0.95000;
double temp;
int i = 1;
do{
temp = x_n;
x_n = fi(x_n);
out << i++ << " " << temp << " " << x_n << " " << 1/(1-q)*fabs(x_n-temp) << endl;
} while(1/(1-q)*fabs(x_n-temp)>epsilon);
out.precision (5);
out << "x = " << x_n << "+/-" << epsilon << endl;
return 0; }
Приложение 2 (к заданию 3)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main ()
{
float x [8] = {(float)0.00, (float)0.08, (float)0.13, (float)0.20, (float)0.27, (float)0.31, (float)0.38, (float)0.44};
float y [8] = {(float)1.00000, (float)1.72539, (float)1.97664, (float)1.92950, (float)1.45474, (float)1.07307, (float)0.42687, (float)0.09338};
float xx = (float)0.11061151;
float yy = (float)0.;
ofstream out ("Zadanie№3.txt");
out.precision (5);
out.setf (ios::fixed);
for (int i=1; i<4; i++)
{
float p = 1.;
for (int j=1; j<4; j++)
{
if (j!=i)
{
p *= (xx-x[j])/(x[i]-x[j]);
}
}
yy += p*y[i];
}
out << yy << endl;
//Оценка погрешности метода
float om = 1;
for (int i=1; i<4; i++)
om*=xx-x[i];
float a = 0;
float p = 1;
for (int i=0; i<4; i++)
{
for (int j=0; j<4; j++)
{
if (j!=i)
{
p+= 1/(x[i]-x[j]);
}
}
a+= p;
}
float r = fabs(a*om);
out << "Погрешность метода равна:" << endl;
out << r << endl;
float l = .75;
float eps = (float).00001;
float d = eps*l;
out << "Погрешность вычислений равна:" << endl;
out << d << endl;
out << "Суммарная погрешность равна:" << endl;
out << r+d;
return 0;
}
Приложение 3 (к заданию 4)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main ()
{
float e = (float)0.001;
float x;
float a = (float)0.85, b = (float)0.89;
float c;
ofstream out ("zadanie№4.txt");
out.precision (5);
out.setf (ios::fixed);
//Метод половинного деления
out << "Метод половинного деления:" << endl;
int i=0;
while (fabs (a-b) >= e)
{
out << i << ' ' << a << ' ' << b << ' ' << fabs(a-b) << endl;
c = (a+b)/2;
if ((tan (1.86*a) + 3*a)*(tan (1.86*c) + 3*c) < 0.)
b = c;
else
a = c;
i++;
}
out << i << ' ' << a << ' ' << b << ' ' << fabs(a-b) << endl;
x = (a+b)/2;
out << x << endl;
//Метод Ньютона
out << "Метод Ньютона:" << endl;
float xn, xn1 = (float)0.85;
xn = xn1 - (tan (1.86*xn1) + 3.*xn1)/(1.86/(cos (xn1*1.86)*cos(xn1*1.86))+3.);
i = 0;
while (fabs (xn-xn1) >= e)
{
out << i << ' ' << xn << ' ' << fabs (xn-xn1) << endl;
xn1 = xn;
xn = xn1 - (tan (1.86*xn1) + 3.*xn1)/(1.86/(cos (xn1*1.86)*cos (xn1*1.86))+3.);
i++;
}
out << i << ' ' << xn <<' ' << fabs (xn-xn1) << endl;
out << xn1 << endl;
//Метод хорд
out << "Метод хорд:" << endl;
float xn2;
xn = (float)0.85;
xn1 = (float)0.89;
xn2 = xn1 - (tan (1.86*xn1) + 3.*xn1)*(xn1 - xn)/((tan (1.86*xn1) + 3.*xn1)-(tan (1.86*xn) + 3.*xn));
i = 0;
while (fabs (xn2-xn1) >= e)
{
out << i << ' ' << xn2 <<' ' <<fabs (xn2-xn1) << endl;
xn = xn1;
xn1 = xn2;
xn2 = xn1 - (tan (1.86*xn1) + 3.*xn1)*(xn1 - xn)/((tan (1.86*xn1) + 3.*xn1)-(tan (1.86*xn) + 3.*xn));
i++;
}
out << i << ' ' << xn2 <<' ' <<fabs (xn2-xn1)<< endl;
out << xn2;
return 0;
}
Приложение 5 (к заданию 6)
#include <iostream>
#include <fstream>
#include "math.h"
using namespace std;
const double pi=3.141592653589;
int main()
{
double step = 1./12;
double halfstep = step/2;
double intS, intHS;
double defect;
ofstream out("Zadanie№6.txt");
out.precision (6);
out.setf (ios::fixed);
out << "Метод правых прямоугольников" << endl;
intS = 0.;
for (int i=0; i < 12; i++)
{
intS += step * cos(pi*(pow(step*i,2))/2);
}
intHS = 0.;
for (int i=0; i<24; i++)
{
intHS += halfstep * cos(pi*(pow(halfstep*i,2))/2);
}
out << "Интеграл (с шагом h) = " << intS << endl << "Интеграл (с шагом h/2) = " << intHS << endl;
defect = fabs(intHS - intS)/3;
intS = intHS + fabs(intHS - intS)/3;
out << "Итог:" << endl;
out << "Интеграл = " << intS << "\tПогрешность = " << defect << endl << endl;
out << "Метод левых прямоугольников" << endl;
intS = 0.;
for (int i=1; i<=12; i++)
{
intS += step * cos(pi*(pow(step*i,2))/2);
}
intHS = 0.;
for (int i=1; i<=24; i++)
{
intHS += halfstep * cos(pi*(pow(halfstep*i,2))/2);
}
out << "Интеграл (с шагом h) = " << intS << endl << "Интеграл (с шагом h/2) = " << intHS << endl;
defect = fabs(intHS - intS)/3;
intS = intHS + fabs(intHS - intS)/3;
out << "Итог:" << endl;
out << "Интеграл = " << intS << "\tПогрешность = " << defect << endl << endl;
out << "Метод средних прямоугольников" << endl;
intS = 0.;
for (int i=0; i<12; i++)
{
intS += step * cos(pi*(pow(step*i+step/2,2))/2);
}
intHS = 0.;
for (int i=1; i<=24; i++)
{
intHS += halfstep * cos(pi*(pow(halfstep*i+halfstep/2,2))/2);
}
out << "Интеграл (с шагом h) = " << intS << endl << "Интеграл (с шагом h/2) = " << intHS << endl;
defect = fabs(intHS - intS)/3;
intS = intHS + fabs(intHS - intS)/3;
out << "Итог:" << endl;
out << "Интеграл = " << intS << "\tПогрешность = " << defect << endl << endl;
out << "Метод трапеций" << endl;
intS = 0.;
for (int i=0; i<12; i++)
{
intS += step/2 * (cos(pi*(pow((step*i),2))/2) + cos(pi*(pow((step*(i+1)),2))/2));
}
intHS = 0.;
for (int i=0; i<24; i++)
{
intHS += halfstep/2*(cos(pi*(pow((halfstep*i),2))/2) + cos(pi*(pow((halfstep*(i+1)),2))/2));
}
out << "Интеграл (с шагом h) = " << intS << endl << "Интеграл (с шагом h/2) = " << intHS << endl;
defect = fabs(intHS - intS)/3;
intS = intHS - fabs(intHS - intS)/3;
out << "Итог:" << endl;
out << "Интеграл = " << intS << "\tПогрешность = " << defect << endl << endl;
out << "Метод Симпсона" << endl;
intS = 0.;
for (int i=0; i<6; i++)
{
intS += step/3 * (cos(pi*(pow(step*i*2,2))/2) + 4*cos(pi*(pow(step*(i*2+1),2))/2)+cos(pi*(pow(step*(i*2+2),2))/2));
}
intHS = 0.;
for (int i=0; i<12; i++)
{
intHS += halfstep/3 * (cos(pi*(pow(halfstep*i*2,2))/2) + 4*cos(pi*(pow(halfstep*(i*2+1),2))/2)+cos(pi*(pow(halfstep*(i*2+2),2))/2));
}
out << "Интеграл (с шагом h) = " << intS << endl << "Интеграл (с шагом h/2) = " << intHS << endl;
defect = fabs(intHS - intS)/15;
intS = intHS - fabs(intHS - intS)/15;
out << "Итог:" << endl;
out << "Интеграл = " << intS << "\tПогрешность = " << defect;
out.close();
return 0;
}
Приложение 6 (к заданию 7)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main ()
{
ofstream out ("zadanie№7.txt");
out.precision (11);
out.setf (ios::fixed);
double I = 0.;
double t [4] = {-0.86113631, -0.33998104, 0.33998104, 0.86113631};
double A [4] = {0.34785484, 0.65214516, 0.65214516, 0.34785484};
for (int i=0; i<4; i++)
{
I += A[i]*(1/(6+t[i]));
}
double R = (double)40320/(double)(9*9*9*9*9*9*9*9*9)/(double)3472875;
out << I << "+/-" << R;
return 0;
}
Приложение 7 (к заданию 8)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
double f(double arg),
f1(double arg);
double x0 = (double)0.94, x1 = (double)0.95,
Temp,
Epsilon = 0.00001;
int main()
{
ofstream File ("Zadanie№8.txt");
File.precision(14);
File.setf(ios::fixed);
x1 = x0 - f(x0)/f1(x0);
double xn = f1(x0);
int iCount=0;
File << "Метод ложных положений:" << endl;
while (fabs (x0-x1) >= Epsilon)
{
File << iCount << " " << x0 << " " << f(x0) << endl;
x0 = x1;
x1 = x0 - f(x0)/f1(x0);
iCount++;
}
File << iCount << " " << x0 << " " << f(x0) << endl;
File << "Ответ: " << x1 << endl;
iCount = 0;
x0 = 0.94;
x1 = 0.95;
File << "Модифицированный метод Ньютона:" << endl;
while (fabs (x0-x1) >= Epsilon)
{
File << iCount << " " << x0 << " " << f(x0) << endl;
x0 = x1;
x1 = x0 - f(x0)/xn;
iCount++;
}
File << iCount << " " << x0 << " " << f(x0) << endl;
File << "Ответ: " << x1 << endl;
iCount = 0;
x0 = 0.94;
x1 = 0.95;
File << "Метод секущих:" << endl;
while (fabs (x0-x1) >= Epsilon)
{
File << iCount << " " << x0 << " " << f(x0) << endl;
Temp = x1;
x1 = x1-(x1-x0)*f(x1)/(f(x1)-f(x0));
x0 = Temp;
iCount++;
}
File << iCount << " " << x0 << " " << f(x0) << endl;
File << "Ответ: " << x1 << endl;
iCount = 0;
x0 = 0.94;
x1 = 0.95;
File << "Метод Стефенсона:" << endl;
while (fabs (x0-x1) >= Epsilon)
{
File << iCount << " " << x0 << " " << f(x0) << endl;
x0=x1;
x1 = x0 - pow(f(x0), 2)/(f(x0+f(x0))-f(x0));
iCount++;
}
File << iCount << " " << x0 << " " << f(x0) << endl;
File << "Ответ: " << x1 << endl;
File.close();
return 0;
}
double f(double arg)
{
return (double) pow(arg,317)-pow(sin(arg),3);
}
double f1(double arg)
{
return (double)(316*pow(arg,136)-3*pow(sin(arg),2)*cos(arg));
}
Приложение 8 (к заданию 13)
#include <iostream>
#include <fstream>
#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 ()
{
ofstream File ("zadanie№13.txt");
File.precision (18);
File.setf (ios::fixed);
while (MachineFault + 1. > 1.)
{
MachineFault = MachineFault/2.;
}
MachineFault = MachineFault*2.;
File << "Эпсилон машинная = " << MachineFault << endl;
double Factor[6] = {36857.604, -36536.213, 12660.512, -1528.592, -46.224, 16.};
double DerivativeFactor[5] = {-36536.213, 25321.024, -4585.776, -184.896, 80};
File << "x = -12" << endl;
double V [6];
double Root = -12;
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]);
File << iCount << " " << V[iCount] << endl;
}
for (iCount=0; iCount<6; iCount++)
{
Fault += fabs(V[iCount]*MachineFault);
}
Fault = Fault*Root;
File << "Погрешность = " << Fault << endl;
File << "x = 3.72225" << endl;
double V1 [5];
Root = (double)3.72225;
for (iCount=0; iCount<5; iCount++)
{
Temp = 1.;
for (int jCount=0; jCount<iCount; jCount++)
Temp = Temp*Root;
V1[iCount] = Temp*fabs(DerivativeFactor[iCount])/fabs(4.*DerivativeFactor[4]*pow(Root, 3) + 3.*DerivativeFactor[3]*pow(Root, 2) + 2.*DerivativeFactor[2]*Root + DerivativeFactor[1])/Root;
File << iCount << " " << V1[iCount] << endl;
}
Fault = 0.;
for (iCount=0; iCount<5; iCount++)
{
Fault += fabs(V1[iCount]*2.*MachineFault);
}
Fault = Fault*Root;
File << "Погрешность = " << Fault << endl;
File << "Поиск методом Ньютона:" << endl;
File << "Простой корень:" << endl;
double Xn1 = (double)-13, Xn;
double Epsilon = MachineFault*12;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount=0;
while (fabs (Xn-Xn1) >= Epsilon)
{
File << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
Xn1 = Xn;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount++;
}
File << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
File << "x1 = "<< Xn1 << " " << -12 - Xn << endl;
File << "Кратный корень:" << endl;
Xn1 = (double)3.5;
Epsilon = MachineFault*3.7225;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount=0;
while (fabs (Xn-Xn1) >= Epsilon)
{
File << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
Xn1 = Xn;
Xn = Xn1 - F(Xn1)/Derivative(Xn1);
iCount++;
}
File << iCount << " " << Xn1 << " " << Xn << " " << fabs (Xn-Xn1) << endl;
File << "x2,3,4,5 = "<< Xn << " " << 3.72225 - Xn << endl;
File.close();
return 0;
}
double F(double arg)
{
return pow((2*arg - 7.4445), 4) * (arg + 12);
}
double Derivative(double arg)
{
return 8 * pow((2*arg - 7.4445), 3)*(arg+12) + pow((2*arg - 7.4445), 4);
}
Приложение 9 (к заданию 14)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
double MachineFault(double arg),
F(double arg),
FirstDerivative(double arg),
SecondDerivative(double arg);
double Epsilon = 0.5;
double xPoint = (double)0.68;
double ValueInxPoint, ValueInxPoint2;
int K;
double h;
double N = (double)1./(double)3.;
int main ()
{
ofstream File ("zadanie№14.txt");
File.precision (17);
File.setf (ios::fixed);
Epsilon = MachineFault(Epsilon);
File << "Эпсилон машинная = " << Epsilon << endl;
for (int iCount = 0; iCount <= 20; iCount++)
{
K = iCount - 10;
File << "k = " << K << endl;
h = pow(10, (double)K)*pow(Epsilon, N);
File << "h = " << h << endl;
ValueInxPoint = (double)((F(xPoint+h) - F(xPoint-h))/(2.*h));
ValueInxPoint2 = (double)(F(xPoint+h)-2.*F(xPoint)+F(xPoint-h))/pow(h, 2);
File << "Первая производная по разностному = " << ValueInxPoint << " || " << fabs(ValueInxPoint - FirstDerivative(xPoint)) << endl;
File << "Вторая производная по разностному = " << ValueInxPoint2 << " || " << fabs(ValueInxPoint2 - SecondDerivative(xPoint)) << endl;
}
File.close();
return 0;
}
double MachineFault(double arg)
{
while (arg + 1. > 1.)
{
arg = (double)(arg/2.);
}
return (double)(arg*2.);
}
double F(double arg)
{
return (double) asin(pow(arg,(317/3)))-arg;
}
double FirstDerivative(double arg)
{
return (double) ((317*pow(arg,(317/3)))/(3*arg*pow(1-pow(arg,(317/3))*pow(arg,(317/3)),(1/2))))-1;
}
double SecondDerivative(double arg)
{
return (double) ((99538*pow(arg,317/3))/(9*pow(arg,2)*pow(1-(pow(arg,317/3)*pow(arg,317/3)),1/2))+(100489*pow(pow(arg,317/3),3))/((9*pow(arg,2)*pow(1-(pow(arg,317/3)*pow(arg,317/3)),3/2))));
}
2
Документ
Категория
Рефераты
Просмотров
51
Размер файла
292 Кб
Теги
митрофанов, курсовик
1/--страниц
Пожаловаться на содержимое документа