Кафедра
інформатики та обчислювальної інформатики
Дисципліна «ІНФОРМАТИКА»
ЗВІТ
по курсовій роботі
Тема: «Рішення прикладних задач методом дихотомії»
Москва 2009
ЗАВДАННЯ НА КУРСОВУ РОБОТУ
Варіант № 11.
Частина 1
Використання чисельних методів розв'язання нелінійних рівнянь, що використовуються в прикладних задачах.
Для виконання 1 частини необхідно:
Скласти програму і розрахувати значення функції в лівій частині нелінійного рівняння для вирішення завдання відділення коренів;
Скласти логічну схему алгоритму, таблицю ідентифікаторів і програму знаходження кореня рівняння методом дихотомії і методом Ньютона;
Ввести програму в комп'ютер, налагодити, вирішити задачу з точністю ε = 0.0001 і вивести результат;
Передбачити в програмі висновок на екран дисплея процесу отримання кореня.
Рівняння: , [1,2];
Метод чисельного рішення: метод дихотомії, метод хорд.
Рішення.
Метод дихотомії
1. Цей метод дозволяє відшукати корінь рівняння f ( ) = 0 з будь-якою наперед заданою точністю ε.
Передбачається, що шуканий корінь рівняння вже відокремлений, тобто зазначений відрізок [a; b] безперервності функції f (x) такий, що на кінцях цього відрізка функція приймає різні значення.
Суть методу в тому, що [a; b] ділиться пополам.Половіна, де немає кореня відкидається, а інша ділитися на два.
1-й Крок. Обчислення середини відрізка
Якщо f ( ) = 0, то ми знайшли точний корінь рівняння.
Якщо f ( ) · F (x 0) <0, то знаходиться в інтервалі [ ] Отже ;
Інакше
2-й Крок. Обчислення середини відрізка
Якщо f ( ) = 0, то ми знайшли точний корінь рівняння.
Якщо f ( · F (x 1) <0, то ;
Інакше
n-ий Крок. Обчислення середини відрізка
Якщо f ( ) = 0, то ми знайшли точний корінь рівняння.
Якщо f ( · F (x n) <0, то ;
Інакше
Умовою знаходження кореня є:
2. Нелінійне рівняння і умова його рішення:
, [1, 2], ε = 0,0001;
3. Графік функції:
4. Схема алгоритму:
5. Таблиця ідентифікаторів:
Позначення | Ідентифікатор | Тип |
n | n | int |
| a | double |
| b | double |
| eps | double |
x | x | double |
f (x) | f (x) | double |
6. Лістинг програми:
# Include <stdio.h>
# Include <math.h>
double f (double x)
{
return 0.25 * (pow (x, 3)) + x-1.2502;
}
int main (void)
{
int n = 0;
double x, a = 0., b = 2., eps = 0.0001;
while (fabs (ab)> 2 * eps)
{
x = (a + b) / 2,
n + +;
printf ("step =% 3i x =% 11.8lf f (x) =% 11.8lf \ n", n, x, f (x));
if (f (x) == 0)
{
printf ("Tothnii koreni x =% lf \ nkolithestvo iteratsii n =% i \ n", x, n);
return 0;
}
else if (f (a) * f (x) <0) b = x;
else a = x;
}
printf ("Reshenie x =% 11.8lf pri Eps =% lf \ nkolithestvo iteratsii n =% i \ n", x, eps, n);
return 0;
}
7. Лістинг рішення:
step = 1 x = 1.50000000 f (x) =- 0.21392288
step = 2x = 1.25000000f (x) =- 0.00893133
step = 3x = 1.12500000f (x) = 0.08982692
step = 4x = 1.18750000f (x) = 0.04080796
step = 5x = 1.21875000f (x) = 0.01602415
step = 6x = 1.23437500f (x) = 0.00356738
step = 7x = 1.24218750f (x) =- 0.00267680
step = 8x = 1.23828125f (x) = 0.00044659
step = 9x = 1.24023438f (x) =- 0.00111478
step = 10 x = 1.23925781f (x) =- 0.00033401
step = 11 x = 1.23876953f (x) = 0.00005631
step = 12 x = 1.23901367f (x) =- 0.00013885
step = 13 x = 1.23889160f (x) =- 0.00004127
Reshenie x = 1.23889160 pri Eps = 0.0001
kolithestvo iteratsii n = 13
Метод хорд:
1. Цей метод полягає в тому, що до графіка функції проводиться хорда. Знаходимо точку перетину з віссю OX і опускаємо з цієї точки пряму паралельну OY. З точки пе-ресечения прямий і графіка проводимо хорду і операція повторюється до тих пір, поки точка перетину хорди з віссю OX не наблизитися до кореня функції до заданої похибки.
Крок перший:
Нас цікавить точка перетину з віссю ОХ.
Зробимо припущення: х = x 1
y = 0
Введемо позначення
x 0
f ( ) = F (x 0)
Підставимо в рівняння
Звідси
x 1 = x 0 -
Крок другий:
x 2 = x 1 -
Для n-го кроку:
x n = x n -1 -
Умовою знаходження кореня є:
2. Нелінійне рівняння і умова його рішення:
, [1,2], ε = 0,0001;
3. Графік функції:
Таблиця ідетіфікаторов:
| Тип |
n | n | int |
| a | double |
| b | double |
| eps | double |
x | x | double |
f (x) | f (x) | double |
6. Лістинг програми:
# Include <stdio.h>
# Include <math.h>
double f (double x)
{
return (0.25 * (pow (x, 3))) + x-1.2502;
}
int main (void)
{
int n = 0;
double x, a = 1., b = 2., eps = 0.0001, xn;
xn = a;
while (fabs (xn-x)> eps)
{
x = xn;
n + +;
xn = xf (x) * (bx) / (f (b)-f (x));
printf ("step =% 3i x =% 11.8lf f (x) =% 11.8lf \ n", n, xn, f (xn));
}
printf ("pribligennoe znathenie x =% lf pri Eps =% lf \ nkolithestvo iterasii n =% i \ n", xn, eps, n);
return 0;
}
7. Лістинг рішення:
step = 1 x = 1.22334934 f (x) = 0.01236182
step = 2 x = 1.23796144 f (x) = 0.00070219
step = 3 x = 1.23879055 f (x) = 0.00003951
step = 4 x = 1.23883720 f (x) = 0.00000222
pribligennoe znathenie x = 1.238837 pri Eps = 0.0001
kolithestvo iterasii n = 4
Аналіз результатів:
| метод дихотомії | метод хорд |
значення кореня | 1.23889160 | 1.23883720 |
значення функції | -0.00004127 | 0.00000222 |
кількість ітерацій | 13 | 4 |
Висновок: Метод дихотомії простий в реалізації, але має малу швидкістю збіжності в порівнянні з методом хорд, що виражається в кількості кроків. Метод хорд до того ж володіє більшою точністю.
Частина 2
Рішення диференціального рівняння.
Варіант № 11.
Метод Ейлера
1.Математіческое опис
Геометричний зміст методу Ейлера полягає в наступному: диференціальне рівняння визначає в точці (x 0, y 0) напрямок дотичної до шуканої інтегральної кривої
k 0 = y '(x 0) = f (x 0, y 0)
Відрізок інтегральної кривої, відповідний x (X 0, x 1), x 1 = x 0 + h замінюється ділянкою дотичній з кутовим коефіцієнтом k. Знайдена точка (x 1, y 1) використовується в якості нового початкової умови для рівняння y (x 1) = y 1, у ній знову обчислюється кутовий коефіцієнт поля напрямків і процедура повторюється.
На n-му кроці маємо точку (x n -1, y n -1), задану початкова умова для рівняння:
y (x n -1) = y n -1
Рівняння визначає кутовий коефіцієнт дотичної до інтегральної кривої у цій точці
Відповідне рівняння дотичної: y - y n -1 = k (x - x n -1)
Звідси отримуємо значення х = х n , Що відповідає точці: х n = х n -1 + h,
А саме: y n - y n -1 = k n -1 (x n -1 + h - x n -1), або
y n = y n-1 + h · k n-1
y n = y n-1 + h · f (x n-1, y n-1)
Отримана формула є основною розрахунковою формулою методу Ейлера.
Процес обчислень закінчується, коли аргумент після чергового збільшення вийде за межі досліджуваного відрізка .
2. Диференціальне рівняння:
x 0 = 0, y 0 = 1, x max = 1, Δx = 0.01; 0.005; 0.001
3. Схема алгоритму:
5. Таблиця ідентифікаторів:
Позначення | Ідентифікатор | Тип |
s | s | int |
i | i | int |
x | x | double |
x max | x_max | double |
x1 | x1 | double |
Δ x | h [i] | double |
y | y | double |
d | d | double |
f (x) | f (x) | double |
k | k (x, y) | double |
6. Лістинг програми:
# Include <stdio.h>
# Include <math.h>
double k (double x, double y)
{
return ((x / exp (x * x)) -2 .* x * y);
}
double f (double x)
{
return ((1./exp (x * x)) * (1 + x * x / 2.));
}
int main (void)
{
int s, i;
double x, x1, x_max = 1, y, d;
double h [3] = {0.01,0.005,0.001};
FILE * file;
file = fopen ("result.txt", "w +");
for (i = 0; i <= 2; i + +)
{S = 0; y = 1;
fprintf (file, "h (% i) =% lf \ n", i, h [i]);
for (x = 0; x <= x_max; x + = h [i])
{
s + +;
x1 = x + h [i];
y = y + k (x, y) * h [i];
d = yf (x1); / / y-pribl. f (x) - tochnoe
printf ("step =% 4.ix =% 6.4lf y =% 6.4lf yt =% 6.4lf d =% 10.8lf \ n", s, x1, y, f (x1), d);
fprintf (file, "step =% 4.ix =% 10.8lf y =% 10.8lf yt =% 10.8lf d =% 10.8lf \ n", s, x1, y, f (x1), d);
}
}
fclose (file);
return 0;
Висновок: Інтегроване середовище Visual С дозволяє обробляти програми, записані на мові С + +. Для програмування циклічних алгоритмів були використані оператори організації циклів з параметрами, рішення використовує форматується висновок і оператор присвоювання, а також використовувалися оператори виклику функцій. Чим більше крок, тим точніше обчислення.