- Загальна інформація
- Стандартні функції Matlab
- Метод перебору Matlab
- Метод простих ітерацій Matlab
- Метод половинного ділення Matlab
- висновок
Доброго часу доби. У цій статті ми розберемо рішення простих нелінійних рівнянь за допомогою засобів Matlab. Подивимося в дії як стандартні функції, так і самі запрограмуємо три найпоширеніші методи для вирішення нелінійних рівнянь.
Загальна інформація
Рівняння, які містять змінні, що знаходяться в ступенях, що відрізняються від одиниці, або мають нелінійні математичні вирази (корінь, експонента, логарифм, синус, косинус і т.д.), а також мають вигляд f (x) = 0 називаються нелінійними. Залежно від складності такого рівняння застосовують методи для вирішення нелінійних рівнянь.
У цій статті, крім стандартних функцій Matlab, ми розглянемо такі методи:
- метод перебору
- Метод простих ітерацій
- Метод половинного ділення
Розглянемо коротко їх алгоритми і застосуємо для вирішення конкретного завдання.
Стандартні функції Matlab
Для вирішення нелінійних рівнянь в Matlab є функція fzero. Вона приймає в якості аргументів саму функцію, яку вирішуємо, і відрізок, на якому відбувається пошук коренів нелінійного рівняння.
І відразу ж розберемо приклад:
Вирішити нелінійне рівняння x = exp (-x), попередньо визначивши інтервали, на яких існують рішення рівняння.
Отже, для початку слід привести рівняння до потрібного вигляду: x - exp (-x) = 0, а потім визначити інтервали, в яких будемо шукати рішення рівняння. Методів для визначення інтервалів безліч, але так як приклад досить простий ми скористаємося графічним методом.
x = -4.0: 0.001: 4.0; y = x - exp (-x); plot (x, y); grid on;
Тут задали приблизні межі по осі x, щоб можна було побудувати графік і подивитися як поводиться функція. Ось графік:
З графіка видно, що на відрізку [0; 1] є корінь рівняння (там, де y = 0), відповідно в подальшому будемо використовувати цей інтервал. Чим точніше обраний інтервал, тим швидше метод прийде до вирішення рівняння, а для складних рівнянь правильний вибір інтервалу визначає похибка, з якою буде отримана відповідь.
x0 = fzero ( '(x - exp (-x))', [0.0 1.0]); x0 = 0.5671
За допомогою стандартної функції Matlab знаходимо корінь нелінійного рівняння і виводимо. Тепер для перевірки відобразимо всі це графічно:
plot (x, y); grid on; hold on; plot (x0,0, 'r *');
Як ви бачите, все досить точно просчиталось. Тепер ми досліджуємо цю ж функцію за допомогою інших методів і порівняємо отримані результати.
Метод перебору Matlab
Найпростіший метод, який полягає в тому, що спочатку задається якийсь наближення x (бажано зліва від передбачуваного кореня) і значення кроку h. Потім, поки виконується умова f (x) * f (x + h)> 0, значення x збільшується на значення кроку x = x + h. Як тільки умова перестало виконуватися - це значить, що рішення нелінійного рівняння знаходиться на інтервалі [x; x + h].
Тепер реалізуємо метод перебору в Matlab:
f = inline ( 'x - exp (-x)'); h = 0.0001; % Задаємо крок x = 0,0; % Початкове наближення i = 0; % Лічильник ітерацій while (f (x) * f (x + h))> 0 x = x + h; i = i + 1; end x% виводимо рішення i% і витрачений кількість ітерацій
Найкраще створити новий m-файл, в якому і прописати код. Після виклику отримуємо такий висновок:
x = 0.5671 i = 5671
Функцію оголошуємо за допомогою дуже корисною команди inline, в циклі поки виконується умова відсутності коренів (або їх парного кількості), додаємо до x значення кроку. Очевидно, що чим точніше початкове наближення, тим менше ітерацій необхідно затратити.
Метод простих ітерацій Matlab
Цей метод полягає в тому, що функцію перетворять до вигляду: x = g (x). Ці перетворення можна зробити різними способами, в залежності від виду початкової функції. Крім цього слід задати інтервал, в якому і буде проводитися ітераційний процес, а також початкове наближення. Сам процес будується за схемою xn = g (xn-1). Тобто ітераційно проходимо від попереднього значення до наступного.
Процес закінчується як тільки виконається умова: , Тобто, як тільки буде досягнута задана точність. І відразу ж розберемо реалізацію методу простих ітерацій в Matlab для прикладу, який був наведений вище.
f = inline ( 'x - exp (-x)'); x0 = 0,0; % Початкове наближення eps = 0.00001; % Точність N = 100; % Кількість ітерацій, щоб не було зациклення g = inline ( 'exp (-x)'); x1 = g (x0); % Перше значення for i = 1: N% робимо максимум 100 ітерацій if abs (x1 - x0) <= eps break end x0 = x1; x1 = g (x0); end x1 i
Тут має бути все зрозуміло, крім одного: навіщо ставити число ітерацій? Це потрібно для того, щоб програма не зациклюватися і не виконувала непотрібні ітерації, а також тому що не завжди програма може прорахувати рішення з потрібною точністю - тому слід обмежувати число ітерацій.
А ось і висновок програми:
x1 = 0.5671 i = 22
Очевидно, що метод простих ітерацій працює набагато швидше і отримує точне рішення.
Метод половинного ділення Matlab
Метод досить простий: існує відрізок пошуку рішення [a; b], спочатку знаходять значення функції в точці середини c, де c = (a + b) / 2. Потім порівнюють знаки f (a) і f (c). Якщо знаки різні - то рішення знаходиться на відрізку [a; c], якщо немає - то рішення знаходиться на відрізку [c; b]. Таким чином ми скоротили область в 2 рази. Таке скорочення відбувається і далі, поки не досягнемо заданої точності.
Перейдемо до реалізації методу в Matlab:
f = inline ( 'x - exp (-x)'); eps = 0.00001; a = 0,0; b = 1.0; i = 0; while abs (a - b)> eps c = (a + b) / 2; if ((f (c) * f (a)) <0) b = c; else a = c; end i = i + 1; end c i
Все найважливіше відбувається в циклі: послідовно скорочуємо область знаходження рішення, поки не буде досягнута задана точність.
Ось що вийшло у висновку:
c = 0.5671 i = 17
Цей метод добре працює, коли правильно визначено інтервал, на якому знаходиться рішення. Проте, метод простих ітерацій вважається найбільш точним і швидким.
висновок
Сьогодні ми розглянули рішення нелінійних рівнянь в Matlab. Тепер нам відомі методи перебору, половинного ділення, простих ітерацій. А також, коли нам не важливо реалізація методу, то можна використовувати стандартну функцію в Matlab.
На цьому все - спасибі за увагу. У наступній статті ми розберемо рішення систем нелінійних рівнянь в matlab .