【问题标题】:Use Subexpressions to Simplify Long Symbolic Equations in Matlab在 Matlab 中使用子表达式简化长符号方程
【发布时间】:2014-07-21 13:27:18
【问题描述】:

我的问题与这个问题基本相同:

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

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

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

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

感谢您的宝贵时间。

【问题讨论】:

  • 我只知道一种方法可以将您的方程式简化为 MatLab 可以找到的最简单形式:让您的表达式为 X,然后使用 simple(X) 获得您的表达式的最简单形式。替换是我在 MatLab 中不知道的事情。

标签: matlab symbolic-math


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我设法帮助自己解决了两件事(但感谢您的快速回答,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 可用于替换符号函数中的查找和替换表达式,但我更喜欢第一种解决方案,因为我认为由于注意力不集中而出错的风险较小。

    还有什么想法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多