【问题标题】:Create a symbolic function of different length vectors in MATLAB Symbolic Toolbox在 MATLAB Symbolic Toolbox 中创建不同长度向量的符号函数
【发布时间】:2013-11-19 08:24:09
【问题描述】:

我的总体目标是使用 MATLAB 符号工具箱来简化公式化和求解关于方程中参数的常微分方程解的敏感性的过程。就我而言,我有一个具有 2 个状态和 10 个参数的 ODE。一个更小但有代表性的例子看起来像

X = sym('X', [2 1])  % Vector representing state variables
p = sym('p', [3 1]) % Vector representing parameters

% Fitzhugh Nagumo Equations
rhs_1 = symfun(p(3)*(X(1) - X(1)^3/3 + X(2)), [X; p])
rhs_2 = symfun(-(X(1) - p(1) + p(2)*X(2))/p(3), [X; p])

然后,我可以使用诸如“梯度(rhs_1,p)”之类的命令获得用于求解 ODE 的 RHS 对参数的敏感性的偏导数。但后来我想将此梯度转换为一个 matlab 函数 ,它是向量 X 和 p 的函数,而不是这些向量的元素的函数。我需要这些函数采用这种形式,否则我无法在 sundialsTB 工具箱中使用 CVODES 求解器。这可能吗?有没有更简单的方法来完成我想做的事情?

【问题讨论】:

  • 所以你想要一些自动的东西?而且我认为您无法让matlabFunction 执行此操作?

标签: matlab symbolic-math


【解决方案1】:

认识到函数输入的comma-separated list 实际上只是一个元胞数组,您可以通过使用mat2cell 将向量输入转换为标量元胞数组来做到这一点:

x=1:2;
p=1:3;
v = mat2cell([x(:);p(:)],ones(numel(x)+numel(p),1),1);
y1 = rhs_1(v{:})
y2 = rhs_2(v{:})

【讨论】:

  • matlabFunction 没有按需要工作,这不是我所需要的,但它让我更接近。问题是当我将符号函数转换为数值函数时,数值函数将 [X1, X2, p1, p2, p3] 作为输入而不是 [X, p] 作为输入。但看起来我可以使用 mat2cell 来转换 [X; p] 到适当的元胞数组,而不是相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多