数组索引必须为正整数或逻辑值。 出错 firstmain>odefunc (第 12 行) dydt = [b*(c-y(1))/sqrt((c-y(1)).^2+(a*t-y(2)).^2);b(a*t-y(2))/sqrt((c-y(1)).^2+(a*t-y(2)).^2)]; 出错 RK_ode (第 17 行) k1 = h*dydt(t(i),y(i,:))'; 出错 firstmain (第 6 行) [t, y] = RK_ode(@odefunc, tspan, y0, h);
时间: 2023-08-07 07:04:02 浏览: 127
Runge-Kutta,matlab 源码是什么样的,matlab源码怎么用
这个错误通常是由于数组索引中包含了非正整数或逻辑值造成的。在这里,错误的原因可能是由于在 odefunc 函数中的某些计算中,产生了负数的平方根结果,导致代码出现了错误。因此,我们可以使用 abs 函数来确保平方根中的值始终为正数。
下面是修改后的代码:
```matlab
function [t,y] = RK_ode(dydt,tspan,y0,h) % dydt: function handle to ODE % tspan: [ti,tf] % y0: initial conditions % h: step size
ti = tspan(1);
tf = tspan(2);
t = (ti:h:tf)';
n = length(t);
y = zeros(n,length(y0));
y(1,:) = y0'; % 将 y0 转换为一行向量以匹配 y 的维度
for i=1:n-1
k1 = h*dydt(t(i),y(i,:))';
k2 = h*dydt(t(i)+h/2,y(i,:)+k1/2)';
k3 = h*dydt(t(i)+h/2,y(i,:)+k2/2)';
k4 = h*dydt(t(i)+h,y(i,:)+k3)';
y(i+1,:) = y(i,:) + (1/6)*(k1+2*k2+2*k3+k4);
end
end
function dydt = odefunc(t, y)
a=20;
b=40;
c=15;
dydt = [b*(c-y(1))/sqrt(abs((c-y(1)).^2+(a*t-y(2)).^2)); b*(a*t-y(2))/sqrt(abs((c-y(1)).^2+(a*t-y(2)).^2))];
end
% 测试代码
clc
clear
tspan = [0, 10];
y0 = [0, 0];
h = 0.05;
[t, y] = RK_ode(@odefunc, tspan, y0, h);
```
请注意,这段代码仅用于演示如何运行和修改程序,实际应用时可能需要进行更多的测试和调整以确保其正确性。
阅读全文