2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Матлаб, решение системы линейных диффуров
Сообщение09.05.2016, 11:11 


26/04/16
11
Добрый день. Нужна помощь. Нужно решить систему линейных диффуров с 32 переменными. Написал вроде код, н при попытке решить с помощью ode45 выводит ошибку.
Заранее ввожу тоже значения всех констант.
Ввожу : >> [T,Y]=ode45(@func1,T0,X0),
мне выводится ошибка :
Error using func1 (line 5)
Not enough input arguments.

Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Что делать?
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
function dXdt=func1(n11s, n22s, n12s, n21s, n11ms, n22ms, n12ms, n21ms, K22s11ms, K21s11ms, K22s12ms, K21s12ms, K12s11ms, K11s11ms, K12s12ms, K11s12ms, K22s21ms, K21s21ms, K22s22ms, K21s22ms, K12s21ms, K11s21ms, K12s22ms, K11s22ms, K21s22ms11ms, K22s11s21ms, K12s22ms11ms, K22s11s12ms, K11s22s11ms, K11s22s22ms, K11s11ms22ms, K22s11ms22ms)
global T E U11 U22 U21 U12 G T0
T=1; E=0.21; U11=0;U21=0;U12=0;U22=0; G=0.001; T0=[0,2];
X = [n11s;n22s;n12s;n21s;
n11ms;n22ms;n12ms;n21ms;
K22s11ms;K21s11ms;K22s12ms;K21s12ms;
K12s11ms;K11s11ms;K12s12ms;K11s12ms;
K22s21ms;K21s21ms;K22s22ms;K21s22ms;
K12s21ms;K11s21ms;K12s22ms;K11s22ms;
K21s22ms11ms;K22s11s21ms;K12s22ms11ms;K22s11s12ms;
K11s22s11ms;K11s22s22ms;K11s11ms22ms;K22s11ms22ms];
A = [0*1i, 0, T, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, -2*G*1i, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    T, -T, -E-G*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, U22-U12, 0, 0, 0, 0, 0, 0, 0, 0, 0
    -T, T, 0, E-G*1i, 0, 0, 0, 0, 0, U11-U21, 0, 0, 0, 0, 0, 0, 0, 0, 0, U21-U22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0*1i, 0, 0, 0, 0, 0, T, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, -2*G*1i, -T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, T, -T, -E-G*1i, 0, 0, 0, U22-U12, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, -T, T, 0, E-G*1i, 0, 0, 0, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -2*G*1i, T, T, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, T, E+U11-U21-G*1i, 0, T, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, T, 0, U22-U12-3*G*1i-E, T, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, U21-U22, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, T, T, -2*G*1i, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, U21-E-U11-G*1i, T, T, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, 0
    0*1i, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, T, 0, 0, T, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, 0, -2*G*1i, T, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, T U21-U11-E-G*1i, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, U22-U12, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, E+U12-U22-3*G*1i, T, T, 0, -T, 0, 0, 0, 0, U11-U21, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, T, 2*(E+U11-U21-G*1i), 0, T, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, T, 0, -4*G*1i, T, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, T, T, E+U12-U22-3*G*1i, 0, 0, 0, -T, U11-U21, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, -2*G*1i, T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, T E+U11-U21-G*1i, 0, T, 0, U12-U22, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, T, 0, -E+U22-U12-3*G*1i, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, T, T, -2*G*1i, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E+U11+U12-U21-U22-3*G*1i, 0, 0, 0, 0, 0, -T, T
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E+U11+U12-U21-U22-3*G*1i, 0, 0, -T, T, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T+U21+U12-E-U11-U22-3*G*1i, 0, 0, 0, T, -T
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U11+U22-U12-U21-E-3*G*1i, T, -T, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, -2*G*1i, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T, 0, -T, 0, -4*G*1i, 0, 0
    0*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T, 0, -T, 0, 0, 0, 0, -4*G*1i];
dXdt=A*X;







 

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение09.05.2016, 11:45 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Функция func1 должна принимать не кучу аргументов, как у Вас, а вектор (и значение t, даже если оно при вычислении производной не используете)

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение09.05.2016, 14:13 


26/04/16
11
Xaositect в сообщении #1122195 писал(а):
Функция func1 должна принимать не кучу аргументов, как у Вас, а вектор (и значение t, даже если оно при вычислении производной не используете)

я заменил на dXdt=func1(t, X), но ничего не изменилось + теперь он пишет, что не понимает что за переменные у меня. что делать, подскажите пожалуйста? как тогда поменять код?

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение09.05.2016, 14:17 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Странно. Что именно пишет?

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение09.05.2016, 14:38 


26/04/16
11
Xaositect в сообщении #1122228 писал(а):
Странно. Что именно пишет?

>> [T,Y]=ode45(@func1,T0,X0)
Undefined function or variable 'n11s'.

Error in func1 (line 5)
X = [n11s;n22s;n12s;n21s;

Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Получается, что он не понимает что означают мои переменные, видимо их надо как-то задать, просто суть в том, чтобы решить систему и отдельно построить график n11s, поэтому я их и ввожу, но ему что-то непонятно. Больше в коде ничего не менял

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение09.05.2016, 16:18 
Заслуженный участник
Аватара пользователя


01/09/13
4676
Если Вы уже передали $X$, то зачем Вы его переопределить пытаетесь?

SNOP. в сообщении #1122230 писал(а):
Получается, что он не понимает что означают мои переменные

Совершенно верно - ему без разницы какой Вы в них смысл вкладываете.

SNOP. в сообщении #1122230 писал(а):
просто суть в том, чтобы решить систему и отдельно построить график n11s

Значит построете график от $X(0)$ - Вы-то смысл этого элемента знаете.

И ещё. Вы вычисляете матрицу при каждом вызове (а их будет много) $func1$ - это плохо, вот её и только её стоит объявить глобальной переменной и вычислить один раз в самом начале (например, в тот момент, когда Вы $X0$ вычисляете) вне этой функции....

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение09.05.2016, 16:59 


26/04/16
11
Ну матрицу я закоментил. Также закоментил введение X как вектора/
Теперь пишет
>> func1
Error using func1 (line 46)
Not enough input arguments.

>> [T,Y]=ode45(@func1,T0,X0)
Error using *
Inner matrix dimensions must agree.

Error in func1 (line 46)
dXdt=A*X;

Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Что-то опять не так. Как тогда определить X? Он же должен понять, что это вектор, как тогда писать?

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение10.05.2016, 17:18 
Заслуженный участник


12/07/07
4530
SNOP., дублирование сообщений является нарушением правил форума. Дубль будет удалён.
Upd. Дубль удалён.

Пожалуйста, приведите (в теге syntax) полный текст функции после изменений и вызов функции ode45.

-- Вт 10.05.2016 16:21:39 --

Возможно, Вам будет удобней набрать все в m-файле (сценарии или функции) и скопируете сюда (используя тег syntax) весь текст этого m-файла.

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение10.05.2016, 17:56 


26/04/16
11
Используется синтаксис Matlab M
function dX=func1(t, X)
global T E U11 U22 U21 U12 G T0 X0 A
dX=A*X;
 


Потом ввожу все константы и матрицу, дальше вызов:
[T,Y]=ode45(@func1,T0,X0)

в результате вижу:
Error using *
Inner matrix dimensions must agree.

Error in func1 (line 46)
dX=A*X;

Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Что делать?

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение10.05.2016, 18:20 
Заслуженный участник
Аватара пользователя


06/10/08
6422
А X0 у Вас какой?

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение10.05.2016, 18:25 


26/04/16
11
Xaositect в сообщении #1122561 писал(а):
А X0 у Вас какой?

X0=[1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0];
Это пока тренировочный вариант, потом буду варьировать значения всех констант, в том числе и начальные условия

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение10.05.2016, 18:47 
Заслуженный участник
Аватара пользователя


06/10/08
6422
У меня все работает.

код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
global T E U11 U22 U21 U12 G T0 X0 A
T = 1
E = 2
U11 = 3
U22 = 4
U12 = 5
U21 = 6
G = 7
T0 = [0 1]
X0=[1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0];
A = [0*1i, 0, T, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, -2*G*1i, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    T, -T, -E-G*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, U22-U12, 0, 0, 0, 0, 0, 0, 0, 0, 0
    -T, T, 0, E-G*1i, 0, 0, 0, 0, 0, U11-U21, 0, 0, 0, 0, 0, 0, 0, 0, 0, U21-U22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0*1i, 0, 0, 0, 0, 0, T, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, -2*G*1i, -T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, T, -T, -E-G*1i, 0, 0, 0, U22-U12, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, -T, T, 0, E-G*1i, 0, 0, 0, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -2*G*1i, T, T, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, T, E+U11-U21-G*1i, 0, T, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, T, 0, U22-U12-3*G*1i-E, T, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, U21-U22, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, T, T, -2*G*1i, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, U21-E-U11-G*1i, T, T, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, 0
    0*1i, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, T, 0, 0, T, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, 0, -2*G*1i, T, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, T U21-U11-E-G*1i, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, U22-U12, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, E+U12-U22-3*G*1i, T, T, 0, -T, 0, 0, 0, 0, U11-U21, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, T, 2*(E+U11-U21-G*1i), 0, T, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, T, 0, -4*G*1i, T, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, T, T, E+U12-U22-3*G*1i, 0, 0, 0, -T, U11-U21, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, -2*G*1i, T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, T E+U11-U21-G*1i, 0, T, 0, U12-U22, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, T, 0, -E+U22-U12-3*G*1i, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, T, T, -2*G*1i, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E+U11+U12-U21-U22-3*G*1i, 0, 0, 0, 0, 0, -T, T
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E+U11+U12-U21-U22-3*G*1i, 0, 0, -T, T, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T+U21+U12-E-U11-U22-3*G*1i, 0, 0, 0, T, -T
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U11+U22-U12-U21-E-3*G*1i, T, -T, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, -2*G*1i, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T, 0, -T, 0, -4*G*1i, 0, 0
    0*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T, 0, -T, 0, 0, 0, 0, -4*G*1i];

function dX=func1(t, X)
global T E U11 U22 U21 U12 G T0 X0 A
dX=A*X;
end

ode45(@func1, T0, X0)

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение10.05.2016, 19:03 


26/04/16
11
Xaositect в сообщении #1122582 писал(а):
У меня все работает.

код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
global T E U11 U22 U21 U12 G T0 X0 A
T = 1
E = 2
U11 = 3
U22 = 4
U12 = 5
U21 = 6
G = 7
T0 = [0 1]
X0=[1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0];
A = [0*1i, 0, T, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, -2*G*1i, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    T, -T, -E-G*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, U22-U12, 0, 0, 0, 0, 0, 0, 0, 0, 0
    -T, T, 0, E-G*1i, 0, 0, 0, 0, 0, U11-U21, 0, 0, 0, 0, 0, 0, 0, 0, 0, U21-U22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0*1i, 0, 0, 0, 0, 0, T, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, -2*G*1i, -T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, T, -T, -E-G*1i, 0, 0, 0, U22-U12, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, -T, T, 0, E-G*1i, 0, 0, 0, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -2*G*1i, T, T, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, T, E+U11-U21-G*1i, 0, T, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, T, 0, U22-U12-3*G*1i-E, T, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, U21-U22, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, T, T, -2*G*1i, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, U21-E-U11-G*1i, T, T, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, 0
    0*1i, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, T, 0, 0, T, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, 0, -2*G*1i, T, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, T U21-U11-E-G*1i, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, U22-U12, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, E+U12-U22-3*G*1i, T, T, 0, -T, 0, 0, 0, 0, U11-U21, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, T, 2*(E+U11-U21-G*1i), 0, T, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, T, 0, -4*G*1i, T, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, T, T, E+U12-U22-3*G*1i, 0, 0, 0, -T, U11-U21, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, -2*G*1i, T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, T E+U11-U21-G*1i, 0, T, 0, U12-U22, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, T, 0, -E+U22-U12-3*G*1i, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, T, T, -2*G*1i, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E+U11+U12-U21-U22-3*G*1i, 0, 0, 0, 0, 0, -T, T
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E+U11+U12-U21-U22-3*G*1i, 0, 0, -T, T, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T+U21+U12-E-U11-U22-3*G*1i, 0, 0, 0, T, -T
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U11+U22-U12-U21-E-3*G*1i, T, -T, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, -2*G*1i, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T, 0, -T, 0, -4*G*1i, 0, 0
    0*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T, 0, -T, 0, 0, 0, 0, -4*G*1i];

function dX=func1(t, X)
global T E U11 U22 U21 U12 G T0 X0 A
dX=A*X;
end

ode45(@func1, T0, X0)


Да, заработало, возможно end не хватало. А не подскажете, как теперь построить только X(1)? Писать отдельную m-функцию или можно сразу после ode писать?

-- 10.05.2016, 19:15 --

Решил разделить на две части:
Функцию:
Используется синтаксис Matlab M
function dX=func2(t, X)
global T E U11 U22 U21 U12 G T0 X0 A
dX=A*X;
end


 

И Решение как-то так:

код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
T=1; E=0.21; U11=0;U21=0;U12=0;U22=0; G=0.001; T0=[0,1];
X0=[1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0];
A = [0*1i, 0, T, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, -2*G*1i, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    T, -T, -E-G*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, U22-U12, 0, 0, 0, 0, 0, 0, 0, 0, 0
    -T, T, 0, E-G*1i, 0, 0, 0, 0, 0, U11-U21, 0, 0, 0, 0, 0, 0, 0, 0, 0, U21-U22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0*1i, 0, 0, 0, 0, 0, T, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, -2*G*1i, -T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, T, -T, -E-G*1i, 0, 0, 0, U22-U12, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, -T, T, 0, E-G*1i, 0, 0, 0, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -2*G*1i, T, T, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, T, E+U11-U21-G*1i, 0, T, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, T, 0, U22-U12-3*G*1i-E, T, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, U21-U22, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, T, T, -2*G*1i, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, U21-E-U11-G*1i, T, T, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, U12-U22, 0, 0, 0, 0, 0
    0*1i, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, T, 0, 0, T, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, 0, -2*G*1i, T, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, T U21-U11-E-G*1i, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, U22-U12, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, E+U12-U22-3*G*1i, T, T, 0, -T, 0, 0, 0, 0, U11-U21, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, 0, T, 2*(E+U11-U21-G*1i), 0, T, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, T, 0, -4*G*1i, T, 0, 0, -T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, 0, 0, T, T, E+U12-U22-3*G*1i, 0, 0, 0, -T, U11-U21, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, 0, -2*G*1i, T, T, 0, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, 0, T E+U11-U21-G*1i, 0, T, 0, U12-U22, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, T, 0, -E+U22-U12-3*G*1i, 0, 0, 0, U21-U11, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, 0, 0, -T, 0, T, T, -2*G*1i, 0, 0, 0, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E+U11+U12-U21-U22-3*G*1i, 0, 0, 0, 0, 0, -T, T
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, E+U11+U12-U21-U22-3*G*1i, 0, 0, -T, T, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T+U21+U12-E-U11-U22-3*G*1i, 0, 0, 0, T, -T
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U11+U22-U12-U21-E-3*G*1i, T, -T, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, -2*G*1i, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T, 0, -T, 0, -4*G*1i, 0, 0
    0*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -T, 0, T, 0, 0, 0, 0, 0
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, T, 0, -T, 0, 0, 0, 0, -4*G*1i];

ode45(@func2, T0, X0);
plot(T,X(:,1),'x');
grid on
xlabel('t');
 

В результате получаю:
Error using odeplot (line 63)
Error updating the ODEPLOT window. Solution data may have been corrupted. Argument Y cannot be complex.

Error in ode45 (line 435)
stop = feval(outputFcn,tout_new,yout_new(outputs,:),'',outputArgs{:});

Error in reshenie (line 36)
ode45(@func2, T0, X0);
Что за хрень?

-- 10.05.2016, 19:20 --

Можно ли сделать так, чтобы строилась только действительная часть, то есть чтобы он считал все полностью, но строил только действительную часть?

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение11.05.2016, 12:44 
Заслуженный участник
Аватара пользователя


01/09/13
4676
SNOP. в сообщении #1122587 писал(а):
Можно ли сделать так, чтобы строилась только действительная часть, то есть чтобы он считал все полностью, но строил только действительную часть?

http://www.mathworks.com/help/matlab/ref/real.html

 Профиль  
                  
 
 Re: Матлаб, решение системы линейных диффуров
Сообщение11.05.2016, 19:02 


26/04/16
11
Geen в сообщении #1122777 писал(а):
SNOP. в сообщении #1122587 писал(а):
Можно ли сделать так, чтобы строилась только действительная часть, то есть чтобы он считал все полностью, но строил только действительную часть?

http://www.mathworks.com/help/matlab/ref/real.html

Это-то понятно, но проблема в том, что когда я ввожу ode45, он решает и потом пытается построить график через odeplot. но натыкается на комплексную функцию и выдает ошибку. Суть в том, что мне надо решить систему, но строить не все 32 графика, а чтобы он построил только те которые мне надо, причем я знаю что из теории они должны быть действительные, но после решения системы он почему-то отказывается понимать что за переменная ,которую я прошу вызвать(X) и что есть например X(1) и не может этого построить. Как быть?

+ Он пишет:
>> ode45(@func1, T0, Y0)
Error using odeplot (line 63)
Error updating the ODEPLOT window. Solution data may have been corrupted. Argument Y cannot be complex.

Error in ode45 (line 435)
stop = feval(outputFcn,tout_new,yout_new(outputs,:),'',outputArgs{:});
Что делать?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group