在 for 循环中用小时间步解决 DDE
Solving DDE with small time steps in for loop
我想在 MATLAB 中使用 for 循环求解以下 DDE:
xdot(t) = Ax(t) + BKx(t-h)
其中:
A = [0 1 ; -1 0.1];
B = [0 ; 1];
h = 0.2;
K = [-0.0469 -1.7663];
t = [0 5]
用常规程序解决这个问题很简单,结果也可以接受。
sol = dde23(ddefun,lags,history,tspan,options,varargin)
但是,当我尝试使用for循环解决它时,结果是错误的。这是我的 for 循环的简单代码。
time = 0:0.001:5;
for i = 2:5001
x(:,1) = [1 -1];
history(:,1) = [1 -1];
[t h] = ode23(@(t,h)histExam1(t,h,A,B,K),[time(i-1) time(i)],history(:,i-1));
history(:,i)= h(end,:);
sol = dde23(((@(t,y,z)ddefun(t,y,z,A,B,K))),0.2,history(:,i),[time(i-1) time(i)]);
x(:,i)=sol.y(:,end);
end
我认为,此代码中唯一的问题是我的时间步长和延迟输入。我对这两个代码使用相同的 dde 函数,所以这不可能是我想在 for 循环中解决 DDE 的 problem.The 原因是“BK”值,它依赖于状态(不是在这个简单的例子中)并且在每个时间步骤中我需要更新“BK”。
上面用常规方法绘制的正确答案。
上面绘制了我使用“for 循环”得到的错误答案。
有趣的是,正确答案对延迟很敏感。但是延迟不影响第二种方法的答案。
好的。经过数周的思考,终于找到了解决办法。
只需:
sol = dde23(((@(t,y,z)ddefun(t,y,z,A,B,K))),0.2,[1;-1],[0 time(i)]);
让奇迹发生。
此代码可帮助您在每个时间步更新状态。
希望以后对你有帮助。
一切顺利,
新浪
我想在 MATLAB 中使用 for 循环求解以下 DDE:
xdot(t) = Ax(t) + BKx(t-h)
其中:
A = [0 1 ; -1 0.1];
B = [0 ; 1];
h = 0.2;
K = [-0.0469 -1.7663];
t = [0 5]
用常规程序解决这个问题很简单,结果也可以接受。
sol = dde23(ddefun,lags,history,tspan,options,varargin)
但是,当我尝试使用for循环解决它时,结果是错误的。这是我的 for 循环的简单代码。
time = 0:0.001:5;
for i = 2:5001
x(:,1) = [1 -1];
history(:,1) = [1 -1];
[t h] = ode23(@(t,h)histExam1(t,h,A,B,K),[time(i-1) time(i)],history(:,i-1));
history(:,i)= h(end,:);
sol = dde23(((@(t,y,z)ddefun(t,y,z,A,B,K))),0.2,history(:,i),[time(i-1) time(i)]);
x(:,i)=sol.y(:,end);
end
我认为,此代码中唯一的问题是我的时间步长和延迟输入。我对这两个代码使用相同的 dde 函数,所以这不可能是我想在 for 循环中解决 DDE 的 problem.The 原因是“BK”值,它依赖于状态(不是在这个简单的例子中)并且在每个时间步骤中我需要更新“BK”。
上面用常规方法绘制的正确答案。
好的。经过数周的思考,终于找到了解决办法。 只需:
sol = dde23(((@(t,y,z)ddefun(t,y,z,A,B,K))),0.2,[1;-1],[0 time(i)]);
让奇迹发生。 此代码可帮助您在每个时间步更新状态。 希望以后对你有帮助。
一切顺利,
新浪