在MATLAB Symbolic Toolbox中创建不同长度向量的符号函数

时间:2013-11-18 22:08:46

标签: matlab symbolic-math

我的总体目标是使用MATLAB符号工具箱简化制定和求解常微分方程的解与方程中参数的灵敏度的过程。在我的情况下,我有一个ODE,有2个状态和10个参数。一个较小但有代表性的例子看起来像

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解算器。这可能吗?有没有更简单的方法来完成我想要做的事情?

1 个答案:

答案 0 :(得分: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{:})