不确定我是否应该在此处或在Maths stackexchange上发布此内容,如果这是错误的地方,那就很抱歉。我对MATLAB和编程非常陌生,并且在使用有限差分方法进行分配时尝试解决ODE问题时遇到了一些麻烦。
我的有限差分方程是:
z(t+dt) = (dt^2*(γ^2*h*sin(γ*t)-β*z(t)) - z(t-dt)*(1-dt*α)+2*z(t))/(1 + dt*α)
其中t是时间增量的51x1数组。基本上我想计算从0到1的t值的z(t),增量为0.02。我有初始条件z(0)= 0和z(Δt)= 0。
我当前的代码(不是所有的东西,但是那些给我带来麻烦的东西:
dt = 0.02
t = [0:dt:T]';
z(0) = 0
z(dt)= 0
for i = t
z(i+dt) = (dt^2*(gamma^2.*h.*sin(gamma*t)-beta*z(i)) - z(i-dt)*(1-dt*alpha)+2*z(i))/(1 + dt*alpha)
end
在这种情况下,Alpha,beta和gamma都是常量,它们在代码的前面定义。
我不断收到错误“下标索引必须是真正的正整数或逻辑。”我知道MATLAB数组以元素1开头,而不是0,因此尝试访问元素0会产生错误。
我不确定错误是否与我如何进入有限差分函数或初始条件有关。通过设置i = t,我是为t的那些值运行for循环,还是为矩阵中的那些元素运行?例如。当i = 0时,它是试图访问矩阵的0元素,还是将方程中的i变量设置为0,就像我想要的那样?
非常感谢任何帮助。
三江源!
答案 0 :(得分:1)
问题是dt,我认为dt不是整数值,不能用于索引数组。数组索引在Matlab中始终是整数值。请尝试以下代码并检查是否解决了问题
t = [0:dt:T]';
z(1) = 0
z(2)= 0
for i = 2 : length(t)
z(i) = (dt^2*(gamma^2.*h.*sin(gamma*t(i))-beta*z(i)) - z(i-1)*(1-dt*alpha)+2*z(i))/(1 + dt*alpha)
end