我在State System,在边界上有“强制”输入。我的SS方程是: zp = A*z * B。(A是一个方阵,B列)
如果B是一个步骤(沿着经验的时间),没有问题,因为我可以使用
tevent = 2;
tmax= 5*tevent;
n =100;
dT = n/tmax;
t = linspace(0,tmax,n);
u0 = 1 * ones(size(z'));
B = zeros(nz,n);
B(1,1)= utop(1)';
A = eye(nz,nz);
[tt,u]=ode23('SS',t,u0);
而SS是:
function zp = SS(t,z)
global A B
zp = A*z + B;
end
我的问题是我什么时候应用了斜率,所以B将是时间相关的。
utop_init= 20;
utop_final = 50;
utop(1)=utop_init;
utop(tevent * dT)=utop_final;
for k = 2: tevent*dT -1
utop(k) = utop(k-1) +(( utop(tevent * dT) - utop(1))/(tevent * dT));
end
for k = (tevent * dT) +1 :(tmax*dT)
utop(k) = utop(k-1);
end
global A B
B = zeros(nz,1);
B(1,1:n) = utop(:)';
A = eye(nz,nz);
我写了一个新的等式(试图解决),这个问题,但我不能调整“时间步长”,我得不到22x100的u(这是目标)。
for k = 2 : n
u=solveSS(t,k,u0);
end
SolveSS的代码如下:
function [ u ] = solveSS( t,k,u0)
tspan = [t(k-1) t(k)];
[t,u] = ode15s(@SS,tspan,u0);
function zp = SS(t,z)
global A B
zp = A*z + B(:,k-1);
end
end
希望你能帮上忙!
发布于 2012-01-27 17:33:07
您应该定义一个随t
不断变化的函数B
,并将其作为函数句柄传递。这样,您将允许ODE求解器有效地调整时间步长(您使用ode15s
,一个严格的ODE求解器,表明可变时间步长甚至更重要)
代码的形式如下所示:
function [ u ] = solveSS( t,k,u0)
tspan = [t(k-1) t(k)];
[t,u] = ode15s(@SS,tspan,u0,@B);
function y = B(x)
%% insert B calculation
end
function zp = SS(t,z,B)
global A
zp = A*z + B(t);
end
end
https://stackoverflow.com/questions/9033033
复制相似问题