Matlab як отримати чисельний розв'язок системи діфур навколонауковий софт

Начебто вже перемагаю по-тихоньку, не без Вашої допомоги, звичайно :)
Код функції зараз такий:

function dy = oscillator1 (t, x)
global k1 k2 m1 m2;
dy = zeros (4, 1); % 4 equations
dy (1) = -k1 / m1 * x (1) + k2 / m1 * (x (2) - x (1));
dy (2) = -k2 / m2 * (x (2) - x (1));
dy (3) = dy (1);
dy (4) = dy (2);

Я не розумію звідки взагалі параметри t і x беруться до функцій oscillator1? Звідки вони передаються туди? Я не розумію де саме вони передаються і скільки саме змінних передається в цю функцію. )

В Command Window у мене:

clear all;
global k1 k2 m1 m2;
k1 = 2; k2 = 3; m1 = 2; m2 = 3;
t = 1;
# 91; T, Y # 93; = Ode45 (@ oscillator1, # 91; 0 4 # 93;, # 91; 1 1 0 0 # 93;);
plot (T, Y (:, 1), '- o')

Але синусоїди, як і раніше, не виходить. Виходить якийсь спадаючий графік з y = 1 вниз, асимптотично наближаючись до нуля :) на експоненту схожий розгорнуту зліва направо :)

Так, ну коди вірні (з точністю до потрібного Вам інтервалу інтегрування і початкових даних і незрозумілого). На перший погляд синуси не зрозуміло звідки з'являться, бо там чітко видно, що перше рівняння має вигляд і, тому очікувати спадаючу експоненту - це нормально. Правда, на місці трикрапки якась фігня, тому це буде не зовсім експонента. Я не дуже вірю, що навіть при якихось інших початкових даних будуть синуси, але не знаю напевно.
Але мої екстрасенсорні здібності шепочуть мені, що Вам були спочатку дані 2 діффура другого порядку, які, для вирішення на машині, потрібно привести спочатку до 4 діффурам першого порядку. А такий підхід дійсно дає синуси. Перевірте, яке завдання Ви вирішуєте?

Я не розумію звідки взагалі параметри t і x беруться до функцій oscillator1? Звідки вони передаються туди? Я не розумію де саме вони передаються і скільки саме змінних передається в цю функцію. )


Вони передаються туди з функції ode45. Функція ode45 реалізує популярний інтегратор діффуров 1-го порядку по вкладеним формулами Рунге-Кутта 5 (4) Дорман-Прінса. Інтегратора потрібно обчислювати значення правої частини діффуров в деяких точках. Ось він дивиться в яких і підставляє потрібні значення в функцію oscillator. Ви можете самі це простежити, благо вихідний код функції ode45 відкритий.

Ну тоді, як це зазвичай робиться, введіть нові змінні і і перепишіть свої рівняння за типом

Тоді матлабовскій ікс буде вектором

Думаю, Ви вже можете все запрограмувати.


Щось все одно не зрозумію як це буде виглядати в Матлабовской функції :) Спробував переписати на таке:

dy (1) = x (1);
dy (2) = x (2);
dy (3) = - (k1 / m1) * x (1) + k2 / m1 * (x (2) - x (1));
dy (4) = - (k2 / m2) * (x (2) - x (1));

але теж мабуть не те. Чи то я в змінних зовсім заплутався. По суті, у мене адже dy (3) і dy (4) це і є v1 ', v2'?