Решение обыкновенных дифференциальных уравнений в среде Scilab
Солвер служит для решения обыкновенного дифференциального уравнения (ОДУ)
dy/dt=f(t,y) , y(t0)=y0
Синтаксис
y=ode(y0,t0,t,f)
[y,w,iw]=ode([type],y0,t0,t [,rtol [,atol]],f [,jac] [,w,iw])
[y,rd,w,iw]=ode("root",y0,t0,t [,rtol [,atol]],f [,jac],ng,g [,w,iw])
y=ode("discrete",y0,k0,kvect,f)
Параметры
y0: действительное число или матрица (условия инициализации)
t0: действительный скаляр (время инициализации)
t: действительный вектор. Задает интервал времени для которого вычисляется решение уравнения.
f: внешний параметр (функция или строка или список).
type: строковая переменная принимающая одну из следующих значений: "adams" "stiff" "rk" "rkf" "fix" "discrete" "roots".adams применяют при решении дифференциальных уравнений или систем методом прогноза-коррекции Адамса; stiff указывают при решении жестких задач; rk используют при решении дифференциальных уравнений или систем методом Рунге-Кутта четвертого порядка; rkf указывают при выборе пятиэтапного метода Рунге-Кутта четвертого порядка; fix тот же метод Рунге-Кутта, но с фиксированным шагом;
rtol, atol: действительные константы и действительные константы того же размера, что и y, по умолчанию rtol=0.00001, atol=0.0000001, при использовании параметров rkf и fix - rtol=0.001, atol=0.0001;
jac: матрица, представляющая собой якобиан правой части жесткой системы дифференциальных уравнений, задают матрицу в виде внешней функции вида J=jak(t,y);
w, iw: векторы, предназначенные для сохранения информации о параметрах интегрирования, которые применяют для того, чтобы последующие вычисления выполнялись с теми же параметрами.
ng: целое число.
g: внешний параметр (функция или строка или список).
k0: целое число (начальное время).
kvect: целочисленный вектор.
Листинг
function yd=f(t,x),yd=-x+sin(t*x),endfunction;
x0=1.5;
t0=0;
t=0:1:35;
y=ode(x0,t0,t,f);
plot(t,y)
Листинг
//Функция, описывающая систему дифференциальных уравнений
function dy=syst(t, y)
dy=zeros(2, 1);
dy(1)=cos(y(1)*y(2));
dy(2)=sin(y(1)+y(2)*t);
endfunction
//Решение системы дифференциальных уравнений
x0=[0; 0];
t0=0;
t=0:0.1:10;
y=ode(x0, t0, t, syst);
//Формирование графического решения
plot(t, y)
xtitle('diff equation', 't, c','y')
legend('y')
Листинг
function dx=syst2(t, x) //Функция задающая систему ОДУ
dx=zeros(3, 1);
dx(1)=-7*x(1)+7*x(2);
dx(2)=157*x(1)+x(2)-1.15*x(1)*x(3);
dx(3)=0.96*x(1)*x(2)-8.36*x(3);
endfunction
//Решение ОДУ
x0=[-1;0;1];
t0=0;
t=0:0.01:2;
y=ode("stiff",x0,t0,t,syst2);
plot(t,y);
xgrid();
Листинг
function F=FF(t,x)
F=[-4*x(1)-13*x(2)+exp(t); x(1)];
endfunction
//Решение системы дифференциальных уравнений
X0=[1;-1];
t0=0.25;
t=0.25:0.05:2;
y=ode("stiff",X0,t0,t,FF);
//Вывод графика решения
plot(t,y);
xgrid();
Листинг
function yy=myfun(t)
yy=5*t*sin(t)*exp(-0.1*t);
endfunction
function dy=syst(t, y)
dy=zeros(2,1);
dy(1)=cos(y(1)*y(2));
dy(2)=sin(y(1)+y(2)*myfun(t));
endfunction
//Решение системы дифференциальных уравнений
clc;
x0=[0;0];
t0=0;
t=0:0.1:20;
y=ode(x0,t0,t,syst);
//Формирование графического решения
plot(t,y)
xtitle('diff equation','t, c','y')
legend('y')
Решение систем линейных алгебраических уравнений
Метод Крамера
Система m уравнений с n неизвестными вида:
- a11x1 + a12x2 + ... + a1nxn = b1,
- a21x1 + a22x2 + ... + a2nxn = b2,
- . . . . . . . . . . . . . . . . . . . . .
- am1x1 + am2x2 + ... + amnxn = bm,
называется системой линейных алгебраических уравнений (СЛАУ), причем xj - неизвестные , aij - коэффициенты при неизвестных , bi - свободные коэффициенты (i=1..m, j=1..n). Система из m линейных уравнений с n неизвестными может быть описана при помощи матриц: A∙x=b, где x - вектор неизвестных, A - матрица коэффициентов при неизвестных или матрица системы, b - вектор свободных членов системы или вектор правых частей . Совокупность всех решений системы (x1, x2,..., xn), называется множеством решений или просто решением системы.
Пример
Решить СЛАУ при помощи правила Крамера:
- 2x1 + x2 - 5x3 + x4 = 8,
- x1 - 3x2 - 6x4 = 9,
- 2x2 - x3 + 2x4 = -5,
- x1 + 4x2 - 7x3 + 6x4= 0.
Правило Крамера заключается в следующем. Если определитель Δ=det(A) матрицы системы из n уравнений с n неизвестными A∙x=b отличен от нуля, то система имеет единственное решение x1, x2,..., xn, определяемое по формулам Крамера: xi=Δi/Δ, где Δi - определитель матрицы, полученной из матрицы системы А заменой i- го столбца столбцом свободных членов b. Текст файла- сценария с решением задачи по формулам Крамера :
- //Матрица коэффициентов:
- A=[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6];
- b=[8;9;-5;0]; //Вектор свободных коэффициентов
- A1=A;A1(:,1)=b; //Первая вспомогательная матрица
- A2=A;A2(:,2)=b; //Вторая вспомогательная матрица
- A3=A;A3(:,3)=b; //Третья вспомогательная матрица
- A4=A;A4(:,4)=b; //Четвертая вспомогательная матрица
- D=det(A); //Главный определитель
- //Определители вспомогательных матриц:
- d(1)=det(A1); d(2)=det(A2); d(3)=det(A3); d(4)=det(A4);
- x=d/D //Вектор неизвестных
- P=A*x-b //Проверка
Результаты работы файла-сценария:
- x =
- 3.
- - 4.
- - 1.
- 1.
- P = 1.0D-14 *
- 0.1776357
- 0.
- - 0.0888178
- 0.1554312
- exec done
Метод обратной матрицы:
для системы из n линейных уравнений с n неизвестными A∙x=b, при условии, что определитель матрицы А не равен нулю, единственное решение можно представить в виде x=A-1∙b.
Текст файла- сценария и результаты его работы :
- //Матрица и вектор свободных коэффициентов системы:
- A=[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6];b=[8;9;-5;0];
- x=inv(A)*b //Решение системы
//Результаты работы файла-сценария:
- --> x =
- 3.
- - 4.
- - 1.
- 1.
Метод Гаусса
Решение системы линейных уравнений при помощи метода Гаусса основывается на том, что от заданной системы, переходят к эквивалентной системе, которая решается проще, чем исходная система.
Метод Гаусса состоит из двух этапов. Первый этап это прямой ход, в результате которого расширенная матрица6 системы путем элементарных преобразований (перестановка уравнений системы, умножение уравнений на число отличное от нуля и сложение уравнений) приводится к ступенчатому виду. На втором этапе (обратный ход) ступенчатую матрицу преобразовывают так, чтобы в первых n столбцах получилась единичная матрица. Последний, n+1 столбец этой матрицы содержит решение системы линейных уравнений. Далее приведен текст файла-сценария и результаты его работы:
- //Матрица и вектор свободных коэффициентов системы:
- A=[2 -1 1;3 2 -5;1 3 -2]; b=[0;1;4];
- //Приведение расширенной матрицы к треугольному виду:
- C=rref([A b]);
- //Определение размерности расширенной матрицы:
- [n,m]=size(C); //m- номер последнего столбца матрицы С
- //Выделение последнего столбца из матрицы С:
- x=C(:,m) //x - решение системы
//Результаты работы программы:
- --> x =
- 0.4642857
- 1.6785714
- 0.75