dde23: Stiff time-delay set of differential eqns

조회 수: 4 (최근 30일)
Sylvia
Sylvia 2015년 7월 17일
편집: Sylvia 2015년 7월 20일
I have a set of 11 differential equations that I want to solve. So far, I have solved the first 3 together using dde23 because they have time delays, and I have solved the last 8 together using ode15s because they're stiff. I don't think I can now solve them as a coupled set because MATLAB has no stiff time-delay solver (correct me if I'm wrong please). So here is my proposed solution:
1. Define a time point array over which to iterate. For the time span associated with each iteration, solve the first three equations with dde23. 2. Plug the solution of the first three equations at the later time point into the last 10 equations and solve with ode15s. I suppose this is a backward Euler-esque approach. 3. Update the history file for the first three equations with the solution from 1.
In the help page for dde23, it says that the history file can be specified as "The solution sol from a previous integration, if this call continues that integration." I'm not sure how this looks in practice. Here is the structure that I have:
function [soln, soln2] = fullSScollHM
...
timepts = linspace(0,1000,1000);
for tt = 1:length(timepts)-1
t0 = timepts(tt); tf = timepts(tt+1);
sol = dde23(@collHMfunc,lags,@coll2hist,[t0,tf],opts);
Ni = sol.y(1,end) + sol.y(2,end) + sol.y(3,end);
sol2 = ode15s(@(t,y) fullSSfunc(t,y,Ni),[t0,tf],...
[P0 qw0 qi0 T0 rw0 ri0 Sw0 qv0]);
...
end
function dnidt = collHMfunc(t,ni,Z)
...
nilag1 = Z(:,1); nilag2 = Z(:,2); nilag3 = Z(:,3);
dnidt(1) = ..
dnidt(2) = ..
dnidt(3) = ..
dnidt = dnidt';
end
function s = coll2hist(~,~,~)
if(counter ~= 1)
s = sol;
else
s = [0; 0; 0;];
end
end
function dy = fullSSfunc(~,y,Ni)
dy(1) = ..
dy(2) = ..
dy(3) = ..
dy(4) = ..
dy(5) = ..
dy(6) = ..
dy(7) = ..
dy(8) = ..
dy = dy';
end
end
Does the proposed solution seem reasonable? Has anyone used the solution of dde23 as the history file for the next run? Thank you for any help. - Sylvia
  댓글 수: 1
Sylvia
Sylvia 2015년 7월 20일
편집: Sylvia 2015년 7월 20일
This works but I'm not sure whether I am using the last point of sol as my constant history or the actual structure of sol as my time-varying history:
function [sol, sol2] = fullSScollHM
...
timepts = linspace(0,1000,1000);
sol = dde23(@collHMfunc,lags,@coll2hist,[0,timepts(2)],dqwdt,dqidt);
for tt = 2:length(timepts)-1
t0 = timepts(tt); tf = timepts(tt+1);
sol = dde23(@collHMfunc,lags,sol,[t0,tf],opts);
Ni = sol.y(1,end) + sol.y(2,end) + sol.y(3,end);
sol2 = ode15s(@(t,y) fullSSfunc(t,y,Ni),[t0,tf],...
[P0 qw0 qi0 T0 rw0 ri0 Sw0 qv0]);
...
end
function dnidt = collHMfunc(t,ni,Z)
function s = coll2hist(~,~,~)
s = [0; 0; 0;];
end
function dy = fullSSfunc(~,y,Ni)
end

댓글을 달려면 로그인하십시오.

답변 (0개)

카테고리

Help CenterFile Exchange에서 Delay Differential Equations에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by