将外部变量传递给函数以使用 lsode 以八度音程保存

问题描述 投票:0回答:1

我有一个函数想要用 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”放在参数列表中。

我不能使用匿名函数,因为我正在研究的实际函数更复杂(不仅仅是线性振荡器)。

function octave external
1个回答
0
投票

我知道这个问题有点老了,但我想添加一个我找到的答案 - 本质上是@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

步骤的简短描述:

  1. 使用您想要传递给它的所有参数创建 ODE 函数定义,例如
    ode_func( x, t, param1, param2, ... )
  2. 创建一个仅接受 (x,t) 格式参数的匿名函数,但该匿名函数的定义 是您的 ODE 函数,并传入实际/定义的参数值。
  3. 使用匿名函数句柄调用
  4. lsode
链接,供参考:

https://lists.gnu.org/archive/html/help-octave/2019-12/msg00131.html

© www.soinside.com 2019 - 2024. All rights reserved.