我的问题与此问题基本相同:
但是,我没有Mathematica,Matlab也没有回答这个问题,而且这已经有2年了,也许人们从那时起就有了一些想法。
像安德烈一样,由于已经很长的函数的多链规则导数,我有一个非常大的等式(大约13000个字符)。导数包含原始方程中的子函数的许多实例及其派生。我相信可以通过合适的替换将功能压缩到至少10。我想知道是否有办法让Matlab自动为我做这些替换。
从性能的角度来看,这也是相关的,因为我对这些方程的公式进行了评估,以求解Jacobi矩阵以求解复杂的非线性方程组。
感谢您的时间。
答案 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)
答案 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
可用于替换符号函数中的查找和替换表达式,但我更喜欢第一种解决方案,因为我认为由于疏忽而导致错误风险较小。
还有什么想法?