Как написать программу для вызова дифференциального уравнения 50 раз, используя FOR l oop в MATLAB, используя ode23s? - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно два, решить два дифференциальных уравнения в зависимости от различных значений vin 50 раз. Мой код написан как:

for i=1:1
[T,Y]=ode23s(@(T,X)sys(T,X,vin),[t0 .00025],X(:,1)) 
vin =-12;
[T1,Y1]=ode23s(@(T,X)sys(T,X,vin),[.00025 .0005],Y(end,:))
vin=12
[T2,Y2]=ode23s(@(T,X)sys(T,X,vin),[.0005 .00075],Y1(end,:))
vin=-12
[T3,Y3]=ode23s(@(T,X)sys(T,X,vin),[.00075 .001],Y2(end,:))
end
Tf=[T;T1;T2;T3];
Xf=[Y;Y1;Y2;Y3];

Теперь мне нужно сделать это для 100 циклов, которые составляют до Y50 и T50, используя цикл for Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

odextend, примененный к структуре решения (последний вариант вызова решателя в документации), принимает последнее состояние и новое уравнение и расширяет структуру решения, используя тот же решатель, до нового конца время.

Таким образом,

T=linspace(0,0.025,101); 
vin = 12
sol = ode23s(@(T,X)sys(T,X,vin),[T(1) T(2)],X0); 
for k=2:100
  vin = -vin
  sol = odextend(sol,@(T,X)sys(T,X,vin),T(k+1));  
end

должно работать, моя октавная версия, к сожалению, не имеет odextend для проверки синтаксической правильности.

Решение может быть оценено с помощью образцы и плотный вывод

Tsmooth = linspace(0,0.025,2001)
Ysmooth = deval(sol,Tsmooth)

hold on;
plot(Tsmooth, Ysmooth(:,1), '-b');
plot(sol.x, sol.y(:,1), '+r');
hold off;
0 голосов
/ 31 марта 2020

Положите его в дополнительные л oop

sct = t0:.00025:.001;
len = length(sct)-1;

vin =-12;

for i = 1:1
    % preallocate memory
    T = NaN(1,len);
    Y = NaN(size(X,1),len);
    Y(:,1) = X(:,1);
    for j = 1:len
        [tmpT,tmpY]=ode23s(@(T,X)sys(T,X,vin),sct(j:j+1),Y) 
        T(j) = tmpT;
        Y(:,j) = tmpY;
    end

    %TODO: do something with T & Y otherwise it will get overwritten in the next iteration of i
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...