Розробка програмного забезпечення для вирішення рівнянь з однією змінною методом Ньютона дотичних

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

ВСТУП

У даний момент існує багато програм для вирішення рівнянь, обчислення інтегралів і диференціалів: MathCAD, MATLAB, і т.д. Вони мають високу точність обчислення, високу функціональність, але мають і свої недоліки. Головні з них - складний незрозумілий інтерфейс, висока багатофункціональність недоступна рядовому користувачеві.
Ринок потребує більш простих аналогах наведених вище програм. Створений програмний продукт здатний розв'язувати рівняння з однією змінною методом Ньютона (дотичних). Він простий в експлуатації, має інтуїтивно зрозумілий інтерфейс і здатний вибудовувати графік рівняння, що є дуже важливим для користувача.
Програма буде корисна всім, як студентам вищих навчальних закладів, так і школярам.

1. ПОСТАНОВКА ЗАВДАННЯ

Мета створення програмного продукту
Головною метою роботи є розробка програми здатної розв'язувати рівняння з однією змінною методом Ньютона (дотичних), що повинно бути посібником для студентів вищих навчальних закладів і для учнів математичних класів середньоосвітніх шкіл в зниженні непотрібного навантаження, пов'язаної з численними масивами обчислень.

1.2. Постановка завдання

У даному програмному продукті необхідно реалізувати рішення двох видів рівнянь: y (x) = aЧln (bЧx), y (x) = ax2 + bx + c. Замість коефіцієнтів повинні використовуватися параметри a, b, c, які приймають значення, що вводяться користувачем. Для знаходження коренів, обов'язковим є зазначення проміжків, на яких визначена функція, тому користувач обов'язково вводить проміжки функції m, n. Метод Ньютона є ітераційним методом, отже, повинна вказуватися похибка обчислення ε. Обов'язковою є побудова графіка обраної функції на заданому проміжку.

2. МАТЕМЕТІЧЕСКАЯ МОДЕЛЬ

Дисципліна "Чисельні методи" містить набір методів і алгоритмів наближеного (чисельного) вирішення різноманітних математичних завдань, для яких точне аналітичне рішення або не існує, або занадто складно для використання на практиці. При чисельному рішенні завдань завжди виникає похибка.
Виділяють абсолютну і відносну похибку. Нехай р - точне значення шуканого відповіді, а p  - наближене значення, отримане за допомогою чисельного методу.
Тоді - Абсолютна похибка,
- Відносна похибка.
На першому етапі необхідно знайти відрізок [a, b], на якому функція має рівно один корінь. На другому етапі відбувається уточнення кореня на відрізку з заданою точністю за допомогою одного з чисельних методів.
Метод, що реалізовується в РУОП, називається методом Ньютона. Інша назва методу - метод дотичних.
Початкове умова:
Дано:
рівняння f (x) = 0,
де f (x) ÎC''[m, n], f (m) × f (n) <0,
f '(x) і f''(x) знакопостоянни на відрізку [m, n];
точність e.
Знайти: рішення рівняння з заданою точністю.
Нехай корінь де - Деяке наближення до кореня, - Належну поправку. Розкладемо f (x) лінійно в ряд Тейлора в околиці xn (що відповідає заміні функції в точці на дотичну):
f (ξ) = 0 = f (xi + hi) ≈ f (xi) + f '(xi) × hi.
Звідси:
.
Закон отримання наближень до кореня:
(2.1)
Початкове наближення x0 вибирається з умови:
. (2.2)
x
f (x)
m
n

Графічна ілюстрація методу наведена на малюнку 2.1. Початкова точка в цьому випадку збігається з n.
Малюнок 2.1. - Метод Ньютона
Ідея методу полягає в тому, що послідовність наближень до кореня будується шляхом проведення дотичних до графіка функції і знаходження їх точок перетину з віссю ОХ.
Алгоритм методу.
Крок 1. Знайти перше наближення до кореня x0 за формулою (2.2).
Крок 2. Знаходити такі наближення до кореня за формулою (2.1), поки не виконається умови закінчення:
| Xi-xi +1 | <e.
Остання знайдене наближення і буде коренем.

3. ОПИС І ОБГРУНТУВАННЯ ВИБОРУ МЕТОДУ РІШЕННЯ

Для обгрунтування вибору методу Ньютона для знаходження коренів рівнянь з однією змінною розглянемо два інші ітераційні методу.

3.1. Метод половинного поділу

Інша назва методу - метод дихотомії.
Дано:
рівняння f (x) = 0,
де f (x) ÎC [m, n], f (m) × f (n) <0;
точність e.
Знайти: рішення рівняння з заданою точністю.
Іншими словами, необхідно знайти нуль функції на відрізку з заданою точністю. При цьому функція неперервна і в кінцях відрізка приймає значення різних знаків.
Алгоритм методу:

Крок 1. Відрізок ділиться навпіл. Знаходиться крапка з: = (b + a) / 2 (див. рисунок 3.1).
f (x)

f (n)
0mkn
x
f (m)
Малюнок 3.1. - Метод половинного ділення
Крок 2. Перевіряються такі умови.
1. Якщо f (c) = 0 - корінь знайдений.
2. Якщо f (a) × f (c) <0 - корінь на [a, c], тому b: = c.
3. Якщо f (c) × f (b) <0 - корінь на [c, b], тому a: = c.
Крок 3. Перевіряється умова | ab | <ε. Якщо умова виконана, то вважається, що корінь знайдений. У цьому випадку він приймається рівним а (хоча можна прийняти його рівним b або навіть (a + b) / 2). Інакше перехід до кроку 1.

3.2. Метод ітерацій

Дано:
рівняння f (x) = 0,
де f (x) ÎC '[m, n], f (m) × f (n) <0,
f '(x) знакопостоянна на відрізку [a, b];
точність e.
Знайти: рішення рівняння з заданою точністю.
Ідея методу полягає в тому, що від рівняння f (x) = 0 переходимо з допомогою рівносильних перетворень до рівняння виду x = φ (x). Т. е. завдання зводиться до знаходження абсциси ξ точки перетину двох графіків функції (див. рис.2). У загальному випадку φ (x) = xf (x) * C.
х
у
у = х
у = j (х)
ξ


Малюнок 3.2. - Корінь рівняння
Точка ξ, для якої виконується ξ = φ (ξ), називається нерухомою точкою процесу ітерацій. Очевидно, що ця точка є коренем рівняння f (x) = 0.
Константа З підбирається таким чином, щоб функція φ (x) задовольняла умовам збіжності методу ітерацій:
1) - Є безперервною і диференційовною на [m, n];
2) значення ;
3) для .
Якщо , То З потрібно вибирати так, щоб і для .
Метод полягає в побудові послідовності наближень до кореня. В якості початкового наближення вибирається будь-яка точка x0Î [a, b]. Для визначеності можна брати середину відрізка [a, b]. Як формули отримання подальших наближень виступає сама φ (x):
Алгоритм методу:
Крок 1. Знайти перше наближення до кореня x0 як середину відрізка [m, n].
Крок 2. Знаходити такі наближення до кореня за формулою, поки не виконається умови закінчення:
| Xi - xi +1 | <e.
Остання знайдене наближення і буде коренем.
3.3. Обгрунтування вибору методу
При розгляді обох методів видно, що швидкість збіжності методу Ньютона (дотичних) вище швидкості збіжності методу січних (хорд) і методу ітерацій, отже, оптимальним для реалізації в програмі є метод Ньютона.

4. ОБГРУНТУВАННЯ ВИБОРУ МОВИ ПРОГРАМУВАННЯ

Реалізація поставленої задачі здійснюється на мові програмування Turbo Pascal 7.0.
Система програмування Turbo Pascal, розроблена американською корпорацією Borland, залишається однією з найпопулярніших систем програмування в світі. Цьому сприяє простота що лежить в основі мови програмування Pascal, а також підтримка графічного і текстового режимів, що робить Turbo Pascal потужної сучасної професійної системою програмування.

5. ОПИС ПРОГРАМНОГО РЕАЛІЗАЦІЇ

5.1 Інформаційні потоки

Для наочності роботи програми, руху інформації і взаємодіють програмної частини з апаратною, розроблена схема інформаційних потоків (рисунок 5.1).
Підказки при введенні даних
Повідомлення про помилку введення
Вхідні дані
Введення
проміжків
Введення
параметрів
Введення
похибки
Блок
виведення результатів на екран
Вибір рівняння
Блок обчислень
Варіанти збереження результатів
Значення кореня рівняння
Варіанти продовження
1
2

ПРОГРАМА


Малюнок 5.1 - Схема інформаційних потоків

Блок побудови графіка
Блок допомоги та довідкової інформації
Файл довідкової інформації
Графік
Допомога і довідкова інформація
Блок виходу з програми
1
2

Малюнок 5.1 - Схема інформаційних потоків (продовження)
Умовні позначення:

- Дані, ввіденіе яких можливе
як з файлів, розташованих на
жорсткому диску, так і з клавіатури;
-Дані, виведені на екран;
Дані, що вводяться з файлу.

5.2. Опис функціонування програми

При запуску програми на екрані з'являється титульний лист, що відображає інформацію про студента; далі завантажується меню програми, що складається з п'яти пунктів:
ЗАСТАВКА
Довідка
y (x) = a * ln (b * x)
y (x) = a * x ^ 2 + b * x + c
Побудова графіка
Вхід


Малюнок 5.2 - Схема функціонування програми
- Довідка
- Y (x) = a * ln (b * x)
- Y (x) = a * x ^ 2 + b * x + c
- Побудова графіка
- Вихід
Пункт "Довідка" включає в себе інформацію про метод Ньютона. Пункти "y (x) = a * ln (b * x)" і "y (x) = a * x ^ 2 + b * x + c" є рішеннями рівнянь, де задаються проміжки m і n, параметри a, b (, c), похибка E і виконується збереження у файли. Пункт "Побудова графіка" будує графік обраного рівняння в залежності від введених параметрів і проміжків. Пункт "Вихід" - вихід з програми. Схема функціонування представлена ​​на малюнку 5.2.

5.3. Опис процедур і функцій програми

Procedure title () - виводить титульну сторінку на екран монітора;
Procedure graphica () - ініціалізує графіком.
Procedure pro () - містить в собі змінну р, яка відповідає за кімнату виділеної кнопки, передається як параметр у procedure key (p) і в procedure eat (p, bool), а також містить у собі змінну bool, що відповідає за цикл у рамках procedure pro, передається як параметр у procedure eat (p2, bool);
Procedure eat (p2: byte; var bool: boolean) - в залежності від параметра p2 виконує один з п'яти варіантів подальших дій програми. Змінна bool передається як параметр назад в procedure pro;
Procedure key (p1: byte) - вибудовує графічну картинку меню в залежності від параметра р1;
Procedure equation_1 () - рішення рівняння виду y (x) = aЧln (bЧx). Змінна Е (похибка) приймається як параметр з procedure load_file_3 (E), передає змінну Е як параметр у procedure save_file (E);
Procedure equation_2 () - рішення рівняння виду y (x) = aЧx2 + bЧx + c. Змінна Е (похибка) приймається як параметр з procedure load_file_3 (E), мінлива Е передається як параметр у procedure save_file (E);
Procedure load_file_1 () - завантажує змінні m і n (проміжки функції) з файлу, чи для якої їх введення з клавіатури, в залежності від бажання користувача. m, n - глобальні змінні в рамках програми;
Procedure load_file_2 () - завантажує змінні a і b або a, b, c (залежно від виду функції) (коефіцієнти рівняння) з файлу, чи для якої їх введення з клавіатури, в залежності від бажання користувача. a, b, c - глобальні змінні в рамках програми;
Procedure load_file_3 (var E: real) - завантажує змінну Е (похибка функції) з файлу, чи для якої їх введення з клавіатури, в залежності від бажання користувача. Е передається як параметр і приймається як змінна в procedure equation_1 і equation_2;
Procedure save_file (E: real) - зберігає змінні a, b, (c,) m, n - глобальні в рамках програми в файли або не зберігає, зберігає змінну Е у вигляді параметра в файл, або не зберігає;
Procedure groffunc () - вибудовує графік за значеннями глобальних в рамках програми змінних a, b, (c,) m, n, із зазначеними на осі х наближеннями і коренем рівняння. Містить у собі function f (x: real): real, вираховують значення однієї з функцій у залежності від аргументу х. Змінні у0 (масштаб) і у2 (максимальне значення функції) передаються у вигляді параметрів в procedure setka (y0, y2);
Procedure setka (yn: integer; y2: real) - вибудовує координатну сітку і оцифровку осей x і y в залежності від глобальних в рамках програми змінних m, n і параметрів yn і y2;
Procedure help () - надає користувачеві безпосередню методологічну допомогу.

5.4. Схема взаємодії процедур програми

Для наочності роботи підпрограм програми необхідно зобразити у вигляді схеми їх взаємодія між собою. Взаємодія підпрограм зображено на малюнку 5.3.
procedure pro;
procedure eat (p2: integer; var bool: boolean);
procedure help;
procedure equation_1;
procedure equation_2;
procedure groffunc;
procedure key;
Procedure save_file (E: real);
load_file_1;
load_file_2;
load_file_3 (var E: real);
procedure setka (yn: integer; y2: real);;
procedure title;
procedure graphica;


Малюнок 5.3 - Взаємодія процедур програми
Умовні позначення:
- Запуск процедури на яку вказує стрілка, з процедури з якої вона походить.

5.5. Перелік позначень

5.5.1 Позначення даних, що вводяться

m, n - проміжки функції;
a, b, c - коефіцієнти рівняння, представлені у вигляді параметрів;
E - похибка, аналог ε в розділі "Описі математичної моделі" і в розділі "Опис (і обгрунтування вибору) методу розв'язання".
5.5.2 Позначення виведених даних
y (x) = a * ln (b * x), y (x) = a * x ^ 2 + b * x + c - рівняння використовуються в програмі;
x - невідома, корінь рівняння;
ln - логарифм;
x ^ 2 - невідома x в степені 2.
5.6 Вхідні і вихідні дані
5.6.1 Вхідні дані
y (x) = a * ln (b * x), y (x) = a * x ^ 2 + b * x + c - функція;
m, n: real - лівий і правий проміжки функції відповідно;
a, b, c: real - параметри, коефіцієнти рівняння;
E: real - похибка;
"Допомога і довідкова інформація".
5.6.2 Вихідні дані
x1: real - значення кореня рівняння;
st: string - текстові повідомлення, що виникають в процесі виконання програми (помилки і варіанти подальшого продовження).
5.6.3 Проміжні дані
Bool_of: Boolean - визначає цикл виконання алгоритму рішення;
mass: real - масив [1. . 20];
number: byte - глобальна змінна, номер функції;
code_of: byte - змінна, що відповідає за необхідність пошуку кореня рівняння;
root: real - різниця наближень.

5.7. Алгоритм розв'язання задачі

5.7.1. Алгоритм знаходження кореня рівняння y (x) = aЧln (bЧx)

Алгоритм рішення рівняння виду y (x) = aЧln (bЧx) наводиться на малюнку 5.4.
виконувати
введення
поки ((m <= n) і (((m <0) і (n <0)) або ((m> 0) і (n> 0 ))));
m, n;


введення
поки (b * m> 0);
a, b;
виконувати
якщо (a = 0) то
введення
поки (E> 0);
Всі х на проміжку - корені рівняння;
E;
2
1
висновок
number: = 0;
інакше
виконувати
i: = 1; якщо (a * ln (b * m) * (-a/sqr (m)))> 0 то
mass [i]: = m;
code_of: = 1;
інакше
Малюнок 5.4 - Алгоритм рішення рівняння виду y (x) = aЧln (bЧx)
2
1
Рівняння не має коренів;
Рівняння не має коренів;
x1;


якщо (a * ln (b * n) * (-a/sqr (n)))> 0 то
mass [i]: = n;
code_of: = 1;
інакше
висновок
number: = 0; code_of: = 0;
якщо (code_of = 1) те
виконувати
x1: = mass [i]-a * ln (b * mass [i]) /
(A / mass [i]);
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
поки (root <E);
якщо (x1 <m) або (x1> n) то
висновок
number: = 0; code_of: = 0;
висновок
Малюнок 5.4 - Алгоритм рішення рівняння виду y (x) = aЧln (bЧx) (продовження)

5.7.2. Алгоритм знаходження кореня рівняння y (x) = aЧx2 + bЧx + c
Алгоритм рішення рівняння виду y (x) = aЧx2 + bЧx + c наводиться на малюнку 5.5.
виконувати
введення
поки (m <= n);
введення
поки (E> 0);
Всі х на проміжку - корені рівняння;
a, b, c;
m, n;
E;
2
1


введення
якщо (a = 0) і (b = 0) і (c = 0) то
висновок
number: = 0;
інакше
виконувати
i: = 1;
якщо (a * sqr (m) + b * m + c) * (2 * a)> = 0 то
mass [i]: = m;
code_of: = 1;
інакше
Малюнок 5.5 - Алгоритм рішення рівняння виду y (x) = aЧx2 + bЧx + c
2
1
Рівняння не має коренів;
Рівняння не має коренів;
x1;


якщо (a * sqr (n) + b * n + c) * (2 * a)> = 0 то
mass [i]: = n;
code_of: = 1;
інакше
висновок
number: = 0; code_of: = 0;
якщо (code_of = 1) те
виконувати
x1: = mass [i] - ((a * sqr (mass [i]) +
b * mass [i] + c) / (2 * a * mass [i] + b));
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
поки (root <E);
якщо (x1 <m) або (x1> n) то
висновок
number: = 0; code_of: = 0;
висновок
Малюнок 5.5 - Алгоритм рішення рівняння виду y (x) = aЧx2 + bЧx + c (продовження)
Алгоритми рішення рівнянь ріс.5.4 і рис.5.5 відповідають procedure equation_1 і procedure equation_2 в програмі відповідно.

6. КОМПЛЕКТАЦІЯ І ЗАВАНТАЖЕННЯ ПРОГРАМИ

6.1. Комплектація

Папка my_stuff, в якій міститься:
- RUOP. exe - основний файл програми;
- Help. asc - файл з методологічною інформацією;
- M_n. txt - файл, що містить значення проміжків m і n;
- A_b_c. txt - файл, що містить значення параметрів a, b, c;
- E. txt - файл, що містить значення похибки E;
- Egavga. bgi - файл для роботи з графікою;
- Keyrus. com - файл для роботи з російською мовою;
- Trip. chr - файл, що містить російський шрифт.

6.2. Порядок інсталяції і запуск програми

Потрібно скопіювати папку my_stuff з містяться в ній файлами в папку "c: \ temp \". Для запуску програми необхідно запустити файл RUOP. exe, розташований в папці my_stuff.
При копіюванні програми в іншу папку, неможливими стають робота "Довідки" завантаження і автоматичне збереження інформації у файли.

7. ТЕСТОВІ ПРИКЛАДИ

Тестові приклади необхідні користувачу для того, щоб довідатися про можливості, які надає даний програмний продукт або протестувати його на правильність рішення рівнянь.
Тестові приклади для вирішення рівняння виду y (x) = a * ln (b * x) наводяться в таблиці 6.1.
Таблиця 7.1. Тестові приклади для рівняння виду y (x) = a * ln (b * x)
m
n
a
b
E
Результат
1
10
1
0.5
0.01
2
-20
-0.01
9
-2
0.01
-0.2
9
14
100
1
0.01
Рівняння не має коренів
Тестові приклади для вирішення рівняння виду y (x) = a * x ^ 2 + b * x + c наводяться в таблиці 6.2.
Таблиця 7.2. Тестові приклади для рівняння виду y (x) = a * x ^ 2 + b * x + c
m
n
a
b
c
E
Результат
-10
10
5
29
3
0.01
-0.1054
-10
10
0
4
10
0.01
-2.5
5
20
5
29
4
0.01
Рівняння не має
При введенні в програму даних, що не відповідають вимогам типу, буде з'являтися повідомлення "Помилка введення", поки не будуть введені правильні дані, що відповідають вимогам програми.
Якщо рівняння не має коренів, то побудова графіка і збереження даних, результатів стає неможливим.
При введенні в програму даних, що відповідають вимогам, будуть з'являтися супровідні повідомлення (ради) щодо подальших варіантів продовження.
Якщо рівняння має корінь, то побудова графіка і збереження даних, результатів стає можливим.

ВИСНОВКИ

У процесі створення була написана програма, що здійснює рішення рівняння з однією змінною методом Ньютона (дотичних). Програма здатна вирішувати два види рівнянь, а також вибудовувати графік по вводиться даними.
У програмі реалізована робота з графікою і з файлами, має інтуїтивно зрозумілий інтерфейс, реалізована можливість довідки.
Коректна робота програми забезпечується строгою відповідністю методичних вказівок, а також надійною системою перевірки проміжних результатів у ході виконання самої програми.
Однак відчутними недоліками є розрахунок результатів за все для двох функцій і відсутність дотичних до графіку при побудові графіка функції, усунення яких планується найближчим часом.
У цілому вийшов програмний продукт є відмінним посібником для студентів вищих навчальних закладів і для учнів математичних класів середньоосвітніх шкіл.

ПЕРЕЛІК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ

1. Фаронов В.В. "Turbo Pascal 7.0. Початковий курс": навчальний посібник. - М.: КНОРУС, 2006. - 576 с.
2. Сухарєв М. Turbo Pascal 7.0. Теорія й практика програмування. - СПб: "Наука і техніка", 2003. - 576 с.
3. Методичні вказівки з оформлення студентських робіт для студентів спеціальностей 080403 "Програмне забезпечення автоматизованих систем", 080404 "Інтелектуальні системи прийняття рішень", 050103 "Економічна кібернетика"; Затверджено на засіданні вченої ради ДонДІШІ протокол № 7 від 23.02. 2004 р. - Донецьк: ДонДІШІ, 2004, 46 с.

Додаток А

ТЕХНІЧНЕ ЗАВДАННЯ
А.1 Загальні відомості
Повна назва програмного продукту: "Чисельні методи. Рішення рівнянь з однією змінною методом Ньютона (дотичних)". Її умовне позначення РУОП. Робота виконується студентом 1-го курсу Донецького державного інституту штучного інтелекту (ДонДІШІ), факультету СКІТ, групи СУА-05, Ніколаєвим Олексієм Сергійовичем.
Підставою для розробки РУОП є завдання, видане кафедрою Програмного забезпечення інтелектуальних систем (поїсом).
Плановий термін початку роботи: 17 лютого 2006 року.
Дата захисту роботи: 22 травня 2006 року.
А.2 Призначення та мета створення програми
Дана програма створена як навчальний посібник для студентів вищих навчальних закладів і для учнів математичних класів середньоосвітніх шкіл. Дозволяє вирішувати рівняння виду y (x) = aЧln (bЧx) і y (x) = ax2 + bx + c методом Ньютона (дотичних).
А.3 Вимоги до програмного продукту
А.3.1. Загальні вимоги
Програма повинна виконувати наступні вимоги:
1) вирішувати два види рівнянь: y (x) = aЧln (bЧx) і y (x) = ax2 + bx + c методом Ньютона (дотичних);
2) підтримку графічного меню, що складається з п'яти пунктів:
- Допомога і довідкова інформація;
- Y (x) = aЧln (bЧx);
- Y (x) = aЧx ^ 2 + bЧx + c;
- Побудова графіка;
- Вихід;
3) за вводиться значенням проміжків рівняння і за що вводиться значенням коефіцієнтів рівняння:
- Обчислювати корінь рівняння в залежності від вводяться даних;
- Вибудовувати графік рівняння, відзначаючи, на осі абсцис, проміжні корені рівняння, виводити значення кореня рівняння.
А.3.2. Функціональні вимоги
Для реалізації програмного продукту необхідно розробити:
1) підтримку файлів, надання можливості вирішувати користувачеві самому, вводити початкові дані з файлу або з клавіатури, необхідність збереження даних і отриманих результатів у файли;
2) систему довідкової інформації з реалізується в РУОП методом Ньютона.
А.3.2. Вимоги до технічного забезпечення
Рекомендовані характеристики апаратних засобів:
- КПУ: i486;
- ОЗУ: 4 мб;
- Відеоадаптер VGA, EGA;
- Монітор: VGA, EGA;
- Клавіатура;
- Вільний дисковий простір - близько 100 кілобайт.
А.3.3. Вимоги до програмного забезпечення
Для успішного завантаження програми потрібна наявність операційної системи MS DOS 6.0.
А.3.5. Вимоги до організаційного забезпечення
Організаційне забезпечення включає в себе пояснювальну записку з додатками: технічне завдання, керівництво користувача, екранні форми, тексти програми.

Додаток Б

КЕРІВНИЦТВО КОРИСТУВАЧА
Головне меню з'являється після титульного аркуша. Меню складається з п'яти пунктів. Скролінг здійснюється клавішами "z" і "x". Вхід в підменю здійснюється клавішею "Enter".
У пункті "Довідка" міститься методологічна інформація за методом Ньютона.
У пункті "y (x) = a * ln (b * x)" здійснюється рішення рівняння y (x) = a * ln (b * x) за вводиться параметрами, проміжкам і похибки. У пункті здійснюється завантаження даних з файлів і збереження даних у файли за бажанням користувача.
У пункті "y (x) = a * x ^ 2 + b * x + c" здійснюється рішення рівняння y (x) = a * x ^ 2 + b * x + c по вводиться параметрами, проміжкам і похибки. У пункті здійснюється завантаження даних з файлів і збереження даних у файли за бажанням користувача.
У пункті "Побудова графіка" здійснюється побудова графіка по вводиться в рівняння даними.
У пункті "Вихід" здійснює вихід з програми.

Додаток В

ЕКРАННІ ФОРМИ

Рисунок В.1 - Заставка, титульна сторінка

Рисунок В.2 - Меню

Малюнок В.3 - Загальний вигляд вікна "y (x) = a * ln (b * x)"

Рисунок В.4 - Загальний вигляд вікна "y (x) = a * x ^ 2 + b * x + c"

Рисунок В.5 - Графік функції y (x) = 1 * ln (0.5 * x) на проміжку [1; 10]

Малюнок В.6 - Графік функції y (x) = 5 * sqr (x) +29 * x +3 на проміжку [-10; 10]

Додаток Г

Лістинг програм
program Restorant;
uses CRT, Graph;
var a, b, c, m, n: real;
number, i: byte;
mass: array [1. . 20] of real;
{************************************************* **************************}
procedure title;
begin
textcolor (2);
writeln ('Міністерство освіти України ");
writeln ('Донецький державний інститут штучного інтелекту');
writeln;
writeln ('Кафедра поїсом');
writeln;
writeln;
writeln ('Курсова робота');
writeln ('За курсом "АЯ та П"');
writeln ('На тему: "Рішення нелінійних рівнянь методом Ньютона');
writeln ('(методом січних) "');
writeln;
writeln;
writeln ('Виконав:');
writeln ('Студент групи СУА-05');
writeln ('Миколаїв А.С.');
writeln ('Перевірив:');
writeln ('cт. преп. кафедри поїсом');
writeln ('Бичкова Є.В.');
writeln ('ас. кафедри поїсом');
writeln ('Волченко EB');
writeln;
writeln ('2005');
writeln;
writeln;
textcolor (red);
writeln ('Натисніть "Введення" для продовження "');
textcolor (lightgray); Readln;
end;
{************************************************* **************************}
procedure pro; FORWARD;
{************************************************* **************************}
procedure graphica;
var d, r, e: integer;
begin
d: = detect;
InitGraph (d, r,'');
e: = GraphResult;
if e <> grOK then WriteLn (GraphErrorMsg (e)) else pro;
end;
{************************************************* **************************}
procedure setka (yn: integer; y2: real);
var x, y, cross, dcross: integer;
lx, ly, dlx, dly: real;
st: string;
begin
If abs (m) <abs (n) then
dlx: = Abs (n/6.25) else dlx: = Abs (m/6.25);
dly: = y2 / ((yn-110) / 40);
dcross: = 0;
lx: = 6 * dlx;
SetColor (LightGray);
For cross: = 1 to 7 do
begin
Str (lx: 0: 1, st);
If lx> = 0 then
OutTextXY (535-dcross, yn +7, st) else
OutTextXY (525-dcross, yn +7, st);
lx: = lx-2 * dlx;
dcross: = dcross +80;
end;
x: = 80;
Repeat
SetLineStyle (DottedLn, 0, NormWidth);
Line (x, yn-3, x, 110); Line (x, yn +3, x, 360);
SetLineStyle (SolidLn, 0, NormWidth);
Line (x, yn-3, x, yn +3);
x: = x +40;
Until x = 600;
ly: = 0;
y: = yn;
Repeat
If ly> 0 then
begin
Line (317, y, 323, y);
Str (ly: 0: 1, st);
OutTextXY (295, y +7, st);
end;
ly: = ly + dly;
SetLineStyle (DottedLn, 0, NormWidth);
Line (323, y, 570, y); Line (70, y, 317, y);
SetLineStyle (SolidLn, 0, NormWidth);
y: = y-40;
Until (y <110);
ly: = 0;
y: = yn;
Repeat
If ly <0 then
begin
Line (317, y, 323, y);
Str (ly: 0: 1, st);
OutTextXY (285, y +7, st);
end;
ly: = ly-dly;
SetLineStyle (DottedLn, 0, NormWidth);
Line (323, y, 570, y); Line (70, y, 317, y);
SetLineStyle (SolidLn, 0, NormWidth);
y: = y +40;
Until (y> 360);
end;
{************************************************* **************************}
{************************************************* **************************}
procedure groffunc;
var l, y0: integer;
y1, y2, x, y, mx, my: real;
gr, grand: string;
{************************************************* **************************}
function f (x: real): real;
begin
Case number of
1: f: = a * ln (b * x);
2: f: = a * sqr (x) + b * x + c;
end;
end;
{************************************************* **************************}
begin
If number = 0 then OutTextXY (300, 20, 'Введіть спочатку дані в рівняння!') Else
begin
ClearDevice;
SetBKColor (black);
case number of
1: grand: = ('y (x) =* ln (* x)');
2: begin grand: = ('y (x) =* sqr (x) + * x +');
str (c: 0: 2, gr); insert (gr, grand, 17); end;
end;
str (b: 0: 2, gr); insert (gr, grand, (6 + number * 4));
str (a: 0: 2, gr); insert (gr, grand, 6);
OutTextXY (300, 40, grand);
y1: = 0; y2: = 0;
x: = m;
Repeat
y: = f (x);
if y <y1 then y1: = y;
if y> y2 then y2: = y;
x: = x +0.01;
Until (x> = n);
my: = 250/abs (y2-y1);
If (abs (m)> abs (n)) then mx: = 250/abs (m) else
mx: = 250/abs (n);
y0: = 360-abs (Round (y1 * my));
setka (y0, y2);
SetColor (blue);
Line (320, 360, 320, 90);
Line (70, y0, 590, y0);
Line (320, 90, 317, 93); Line (320, 90, 323, 93);
Line (590, y0, 587, y0-3); Line (590, y0, 587, y0 +3);
OutTextXY (595, y0-5, 'x'); OutTextXY (315, 80, 'y');
OutTextXY (400, 450, 'Натисніть "Введення" для виходу ");
If Abs (m)> Abs (n) then y1: = Abs (m) else y1: = Abs (n);
SetColor (Red);
str (mass [i]: 5: 4, grand);
OutTextXY (300 + Round ((250/y1) * mass [i]), 400, grand);
Line (320 + Round ((250/y1) * mass [i]), y0, 320 + Round ((250/y1) * mass [i]), 390);
For l: = 1 to i-1 do
begin
SetColor (2 + l);
Line (320 + Round ((250/y1) * mass [l]), y0 +10, 320 + Round ((250/y1) * mass [l]), y0-10);
end;
x: = m;
Repeat
y: = f (x);
PutPixel (320 + Round (x * mx), y0-Round (y * my), 15);
x: = x +0.01;
Until (x> = n);
ReadLn;
pro;
end;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure load_file_1;
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
If number = 1 then
WriteLn ('Введіть проміжки [m, n] одного знаку') else
WriteLn ('Введіть проміжки [m, n]');
WriteLn ('Натисніть "1" для введення даних з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
{$ I-}
ReadLn (m, n);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу з розширенням. Txt');
ReadLn (st);
Assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ m_n. Txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
{$ I-}
Read (f, m, n);
{$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (m: 0: 2);
WriteLn (n: 0: 2);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure load_file_2;
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
WriteLn ('Натисніть "1" для введення з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
If number = 1 then {$ I-} ReadLn (a, b) {$ I +} else
If number = 2 then {$ I-} ReadLn (a, b, c) {$ I-};
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу розширенням. Txt');
ReadLn (st);
assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ a_b_c. Txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
If number = 1 then {$ I-} Read (f, a, b) {$ I +} else
{$ I-} Read (f, a, b, c); {$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (a: 0: 2);
WriteLn (b: 0: 2);
If number = 2 then WriteLn (c: 0: 2);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure load_file_3 (var E: real);
var mistake: byte;
k: char;
st: string;
f: text;
begin
Repeat
WriteLn ('Натисніть "1" для введення даних з клавіатури');
WriteLn ('Натисніть "2" для введення даних з файлу');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Введення:');
{$ I-}
ReadLn (E);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Помилка введення');
end;
'2 ': Begin
WriteLn ('Натисніть "1" для вказівки розташування свого файлу');
WriteLn ('Натисніть "2" для введення з файлу, створеного автоматично');
k: = ReadKey;
If k = '1 'then begin
WriteLn ('Введіть шлях до файлу з розширенням. Txt');
ReadLn (st);
assign (f, st);
end else
If k = '2 'then assign (f,' c: \ temp \ my_stuff \ E. txt ');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then
WriteLn ('Немає файлу не існує') else
begin
{$ I-}
Read (f, E);
{$ I +}
mistake: = IOResult; Close (f); If mistake <> 0 then
WriteLn ('Інформація у файлі не відповідає потрібному типу') else
begin
WriteLn (E: 0: 3);
end;
end; WriteLn ('Натисніть "Введення для продовження"'); ReadLn;
end;
end;
Until mistake = 0;
end;
{************************************************* **************************}
procedure save_file (E: real);
var k: char;
mistake: byte;
f: text;
st: string;
begin
Repeat
WriteLn ('Якщо хочете зберегти дані та результати натисніть "1"');
WriteLn ('Якщо не хочете зберігати дані та результати натисніть "2"');
k: = ReadKey;
Case k of
'1 ': Begin
WriteLn ('Якщо хочете зберегти дані в зазначені вами файли натисніть "1"');
WriteLn ('Якщо хочете, щоб збереження відбулося автоматично натисніть "2"');
k: = ReadKey;
If k = '1 'then begin
Repeat
WriteLn ('Введіть шлях та ім'я файлу c для збереження проміжків [m, n]');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, m: 3, n: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
Repeat
If number = 1 then
WriteLn ('Введіть шлях та ім'я файлу для збереження коефіцієнтів "a", "b"')
else
If number = 2 then
WriteLn ('Введіть шлях та ім'я файлу для збереження коефіцієнтів "a", "b", "c"');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
If number = 1 then begin
Write (f, a: 3, b: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end else
If number = 2 then begin
Write (f, a: 3, b: 3, c: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
end;
Until mistake = 0;
Repeat
WriteLn ('Введіть шлях та ім'я файлу для збереження похибки "Е"');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, E: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
Repeat
WriteLn ('Введіть шлях та ім'я файлу для збереження кореня');
ReadLn (st);
Assign (f, st);
{$ I-}
ReWrite (f);
{$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Файл не може бути створений') else
begin
Write (f, mass [i]: 3); Close (f); WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
Until mistake = 0;
end else
If k = '2 'then begin
Assign (f, 'c: \ temp \ my_stuff \ m_n. Txt');
{$ I-} ReWrite (f); {$ I +}
mistake: = IOResult;
If mistake <> 0 then WriteLn ('Каталога для збереження не існує') else
begin
Write (f, m, n); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ a_b_c. Txt');
ReWrite (f); If number = 1 then Write (f, a, b) else
Write (f, a, b, c); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ E. txt');
ReWrite (f); Write (f, E); Close (f);
Assign (f, 'c: \ temp \ my_stuff \ x. txt');
ReWrite (f); Write (f, mass [i]); Close (f);
WriteLn ('Інформація збережена. Натисніть "Введення"'); ReadLn;
end;
end;
end;
'2 ': Mistake: = 0;
end;
Until mistake = 0;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure equation_1;
var mistake, code_of: byte;
E, x1, root: real;
bool_of: boolean;
k: char;
{************************************************* **************************}
begin
closegraph;
bool_of: = false;
Repeat
number: = 1;
clrscr;
WriteLn ('Рівняння виду: y (x) = a * ln (b * x)');
Repeat
load_file_1;
If m> n then begin
WriteLn ('Введіть "m" <"n"');
WriteLn ('Натисніть "Введення" для подолженія'); ReadLn;
end else
If (m <0) and (n> 0) or (m = 0) or (n = 0) then
begin
WriteLn ('"m" і "n" повинні бути одного знака і нерівні 0');
WriteLn ('Натисніть "Введення" для продовження'); ReadLn;
end;
Until (((m <0) and (n <0)) or ((m> 0) and (n> 0))) and (m <= n);
Repeat
WriteLn ('Введіть коефіцієнти рівняння "a", "b"');
load_file_2;
If m * b <= 0 then begin
WriteLn ('спробуйте "b" іншого знака і нерівне 0');
WriteLn ('Натисніть "Введення" для продовження'); ReadLn;
end;
Until m * b> 0;
If a = 0 then begin
WriteLn ('Все "x" на проміжку [', m: 0: 1, ';', n: 0: 1, '] - рішення рівняння');
number: = 0; end else
begin
Repeat
WriteLn ('Введіть похибка "E"');
load_file_3 (E);
If E <= 0 then begin WriteLn ('Введіть "Е" більше 0');
WriteLn ('Натисніть "Введення" для продовження "');
end;
Until E> 0;
i: = 1;
If (a * ln (b * m) * (-a/sqr (m)))> 0 then begin mass [i]: = m; code_of: = 1 end else
If (a * ln (b * n) * (-a/sqr (n)))> 0 then begin mass [i]: = n; code_of: = 1 end else
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end;
If code_of = 1 then
begin
Repeat
x1: = mass [i]-a * ln (b * mass [i]) / (a ​​/ mass [i]);
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
Until root <E;
If (x1 <m) or (x1> n) then
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end else
WriteLn ('Коренем рівняння y (x) =', a: 0: 1, '* ln (', b: 0: 1, '* x) є:', x1: 5: 4);
end;
end;
WriteLn ('Натисніть "Введення"'); ReadLn; If code_of = 1 then save_file (E) else
WriteLn ('Так як рівняння не має коренів, то збереження не виконується');
WriteLn ('Якщо хочете вийти, то натисніть "ESC"');
WriteLn ('Якщо хочете ввести інші дані, то натисніть "Введення"');
k: = ReadKey;
code_of: = ord (k);
case code_of of
27: begin
bool_of: = true; graphica;
end;
13: bool_of: = false;
end;
Until bool_of;
end;
{************************************************* **************************}
{************************************************* **************************}
procedure equation_2;
var mistake, code_of: byte;
E, x1, root: real;
bool_of: boolean;
k: char;
{************************************************* **************************}
begin
closegraph;
bool_of: = false;
Repeat
number: = 2;
clrscr;
WriteLn ('Рівняння виду: y (x) = a * x ^ 2 + b * x + c');
Repeat
load_file_1;
If m> n then WriteLn ('Введіть "m" <"n"');
Until (m <= n);
WriteLn ('Введіть коефіцієнти рівняння "a", "b", "c"');
load_file_2;
If (a = 0) and (b = 0) and (c = 0) then begin
WriteLn ('Все "х" на проміжку [', m: 0: 1, ';', n: 0: 1, '] - рішення рівняння');
number: = 0; end else
begin
Repeat
WriteLn ('Введіть похибка "Е"');
load_file_3 (E);
If E <= 0 then begin WriteLn ('Введіть E> 0');
WriteLn ('Натисніть "Введення" для продовження');
end;
Until E> 0;
i: = 1;
If (a * sqr (n) + b * n + c) * (2 * a)> = 0 then begin mass [i]: = n; code_of: = 1 end else
If (a * sqr (m) + b * m + c) * (2 * a)> = 0 then begin mass [i]: = m; code_of: = 1 end else
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end;
If code_of = 1 then
begin
Repeat
x1: = mass [i] - ((a * sqr (mass [i]) + b * mass [i] + c) / (2 * a * mass [i] + b));
root: = Abs (x1-mass [i]);
i: = i +1;
mass [i]: = x1;
Until (root <E);
If (x1 <m) or (x1> n) then
begin WriteLn ('Рівняння не має коренів'); number: = 0; code_of: = 0; end else
WriteLn ('Коренем рівняння y (x) =', a: 0: 1, '* x ^ 2 +', b: 0: 1, '* x +', c: 0: 1, 'є:', x1: 0: 4);
end;
end;
WriteLn ('Натисніть "Введення"'); ReadLn; If code_of = 1 then save_file (E) else
WriteLn ('Так як рівняння не має коренів, то збереження не виконується');
WriteLn ('Якщо хочете вийти, то натисніть "ESC"');
WriteLn ('Якщо хочете ввести інші дані, то натисніть "Введення"');
k: = ReadKey;
code_of: = ord (k);
case code_of of
27: begin
bool_of: = true; graphica;
end;
13: bool_of: = false;
end;
Until bool_of;
end;
{************************************************* **************************}
procedure key (p1: byte);
Var y1, y2: integer;
name: string;
i: byte;
begin
ClearDevice;
SetColor (white);
OutTextXY (250, 435, '"Введення" - вхід "z", "x" - переміщення по меню');
y1: = 15;
y2: = 70;
for i: = 1 to 5 do
begin
Setcolor (blue);
Rectangle (16, y1-1, 251, y2-1);
RecTangle (17, y1-2, 252, y2-2);
RecTangle (18, y1-3, 253, y2-3);
SetFillStyle (1, lightblue);
Bar (15, y1, 250, y2);
case i of
1: Name: = 'Довідка';
2: Name: = 'y = a * ln (b * x)';
3: Name: = 'y = a * x ^ 2 + b * x + c';
4: Name: = 'Побудова графіка';
5: Name: = 'Вихід';
end;
SetColor (white);
OutTextXY (45, y1 +25, Name);
y1: = 20 + y2;
y2: = 75 + y2;
end;
SetColor (white);
p1: = p1-1;
Rectangle (18, 19 +75 * p1, 246, 66 +75 * p1);
end;
{************************************************* **************************}
procedure help;
var st: string;
f: text;
y: integer;
mistake: byte;
begin
ClearDevice;
Assign (f, 'c: \ temp \ My_stuff \ help. Asc');
{$ I-}
Reset (f);
{$ I +}
mistake: = IOResult; SetTextStyle (0, 0, 0);
If mistake <> 0 then OutTextXY (250, 220, 'Немає файлу не існує') else
begin
y: = 0;
Repeat
y: = 15 + y;
ReadLn (f, st);
OutTextXY (45, y, st);
Until EOf (f);
Close (f);
end;
OutTextXY (400, 450, 'Натисніть "Введення" для виходу ");
ReadLn; pro;
end;
{************************************************* **************************}
procedure eat (p2: byte; var bool: boolean);
begin
if p2 = 1 then help else
if p2 = 2 then equation_1 else
if p2 = 3 then equation_2 else
if p2 = 4 then groffunc else
if p2 = 5 then bool: = true;
end;
{************************************************* **************************}
procedure pro;
var p, code: byte;
k: char;
bool: boolean;
begin
ClearDevice;
p: = 1;
key (p);
bool: = false;
repeat
SetBKColor (lightgray);
SetTextStyle (1, 0, 4); SetColor (blue);
OutTextXY (390, 130, 'МЕНЮ');
SetTextStyle (0, 0, 0);
k: = ReadKey;
code: = ord (k);
Case code of
122: begin
p: = p-1; if p = 0 then p: = 5;
key (p);
end;
120: begin
p: = p +1; if p = 6 then p: = 1;
key (p);
end;
13: eat (p, bool);
end;
until bool;
CloseGraph;
end;
{************************************************* **************************}
begin
title;
number: = 0;
graphica;
end.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
105кб. | скачати


Схожі роботи:
Рішення систем нелінійних алгебраїчних рівнянь методом Ньютона
Розробка програмного забезпечення для пошуку коренів біквадратні рівняння
Розробка бази даних і прикладного програмного забезпечення для автобусного парку
Розробка програмного забезпечення для розр та дисперсійної характеристики планарного хвилеводу
Розробка програмного забезпечення для реалізації арифметичних операцій над комплексними числами
Метод Ньютона для розв`язування нелінійних рівнянь
Розробка програми вирішення системи лінійних рівнянь
Розробка програмного забезпечення
Чисельні методи для вирішення нелінійних рівнянь
© Усі права захищені
написати до нас