在Matlab中使用子表达式简化长的符号方程

4

我的问题本质上与此问题相同:

通过自动引入时间变量或以其他方式简化非常长的符号表达式

然而,我没有Mathematica,并且该问题未得到Matlab的回答,此外,这已经过去2年了,也许人们此后已经有了一些想法。

像Andrey一样,我有一个极其庞大的方程(约13000个字符),是对已经很长的函数进行多重链规则导数计算的结果。该导数包含了原方程中的许多子函数及其导数。我相信可以通过适当替换将函数压缩至少十分之一。我想知道是否有一种方法让Matlab自动完成这些替换。

从性能的角度来看,这也是相关的,因为我有成千上万个这些方程要求求解雅可比矩阵,以解决复杂的非线性方程组。

感谢您的时间。


我只知道一种方法可以将你的方程简化为MatLab能够找到的最简形式: 假设你的表达式是X,然后使用simple(X)来获得你的表达式的最简形式。在MatLab中,我不知道有替换的功能。 - EJG89
2个回答

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)

Source: http://www.mathworks.nl/help/symbolic/subexpr.html


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可用于替换符号函数中的查找和替换表达式,但我更喜欢第一种解决方案,因为我认为它具有更少的疏忽造成错误的风险。

还有其他想法吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接