使用Subexpressions简化Matlab中的长符号方程

时间:2014-07-21 13:27:18

标签: matlab symbolic-math

我的问题与此问题基本相同:

Simplifying a very long symbolic expression by automatically introducing temporal variables or in any other way

但是,我没有Mathematica,Matlab也没有回答这个问题,而且这已经有2年了,也许人们从那时起就有了一些想法。

像安德烈一样,由于已经很长的函数的多链规则导数,我有一个非常大的等式(大约13000个字符)。导数包含原始方程中的子函数的许多实例及其派生。我相信可以通过合适的替换将功能压缩到至少10。我想知道是否有办法让Matlab自动为我做这些替换。

从性能的角度来看,这也是相关的,因为我对这些方程的公式进行了评估,以求解Jacobi矩阵以求解复杂的非线性方程组。

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

MatLab最接近的是subexpr()函数。例如,你有一个公式:

% Declare symnbolic    
syms x
% Define equation
eq1 = x^2 + 3*x^2 + 6*x^2 + x^2/57*x + sqrt(x^2)

% Simplify by substitution
subexpr(eq1)

输出:

sigma = 

x^2

ans =

10*sigma + (sigma*x)/57 + sigma^(1/2)

来源: http://www.mathworks.nl/help/symbolic/subexpr.html

答案 1 :(得分:0)

我设法帮助自己完成了两件事(但感谢您快速回答,EJG89!):

a)不是为每个子函数插入一个表达式,而是将它们保留为未指定的符号函数,如下所示:

%M_g(a,b,c) = F(a,b,c)/G(a,b,c)^2*...
syms M_g(a,b,c)

现在我有一个功能

F_a(a,b,c) = .../M_g(a,b,c)*...

c为例推导出来。我会以D([3], M_g)的形式得到答案,无论衍生物出现在哪里。

b)Matlab函数subs可用于替换符号函数中的查找和替换表达式,但我更喜欢第一种解决方案,因为我认为由于疏忽而导致错误风险较小。

还有什么想法?