我有一个函数想要用 lsode 来解决,就像这样:
function f = fcn(x,t)
% Set spring stiffness and mass
k = 500;
m = 5;
% Assign function
f1 = x(2);
f2 = -(k/m)*x(1);
f = [f1; f2];
endfunction
这是调用这个函数的脚本:
% Initial value
x0 = [0.2, 0];
%time
t = linspace(0,1,500);
[X] = lsode (@fcn, x0, t);
plot(t,X(:,1));
现在,我想循环这个脚本,但每次我想要不同的“k”值。要使用 lsode 求解的函数必须仅接受“x”和“t”作为参数,那么我不能将“k”放在参数列表中。
我不能使用匿名函数,因为我正在研究的实际函数更复杂(不仅仅是线性振荡器)。
我知道这个问题有点老了,但我想添加一个我找到的答案 - 本质上是@Suever 描述的一个有效示例。这是代码(感谢 Jana!),复制并格式化以防链接中断:
“Test.m”调用函数文件“ODE.m”
“Test.m”的内容
clear;
clc;
t = linspace (0, 50, 10); % Time interval for integration
y0 = [ 4; 1.1; 4 ]; % Initial condition for Y(0)
B=[77.27 8.375e-06 0.161]; % Additional fixed parameters used in ODE
funct=@(y0,t)ODE(y0,t,B); % create a function to supply to LODE
y = lsode (funct, y0, t) % Call LODE to solve
“ODE.m”的内容
function y = ODE (x, t, B)
y = zeros (3,1);
y(1) = B(1) * (x(2) - x(1)*x(2) + x(1) - B(2)*x(1)^2);
y(2) = (x(3) - x(1)*x(2) - x(2)) / B(1);
y(3) = B(3)*(x(1) - x(3));
endfunction
步骤的简短描述:
ode_func( x, t, param1, param2, ... )
。lsode
。
https://lists.gnu.org/archive/html/help-octave/2019-12/msg00131.html