【问题标题】:Why does Matlab provide an arbitrary constant of integration?为什么 Matlab 提供任意积分常数?
【发布时间】:2017-03-03 03:29:15
【问题描述】:

我正在整合以下表达式:

sin(2*x)/4 - 8*sin(x)

在 Matlab 中,我输入了

syms x
int(sin(2*x)/4 - 8*sin(x)) 

然后它返回

17*cos(x/2)^2 - cos(x/2)^4

Wolfram,我输入

int(sin(2*x)/4 - 8*sin(x))

然后它返回

8 cos(x) - 1/8 cos(2 x) + constant

为了比较两种解决方案,我将以下内容放入Wolfram

int(sin(2*x)/4 - 8*sin(x)) == 17*cos(x/2)^2 - cos(x/2)^4

它显示了 Matlab 的解决方案给出了积分常数65/8,而 Wolfram 留下了任意积分常数。我很高兴我抓住了这一点,因为它对我的最终解决方案有很大的影响,尽管它是一个常数。我的问题是,为什么 Matlab 觉得需要提供一个常量的集成,而最终它是任意的?看起来有点危险。

【问题讨论】:

  • fwiw mathematica 给出8 Cos[x] - 1/8 Cos[2 x] (没有明确的常数,因为如果您希望阅读文档并理解它会给您一个反导数,并且反导数在任意常数中是非唯一的,就像 matlab 一样)。

标签: matlab wolfram-mathematica wolframalpha


【解决方案1】:

根据int documentation,“int 返回的结果不包括积分常量”。但很明显,在解决方案中引入了一些。所以我想一个更好的说法是:如果找到一个,MATLAB 不会在解决方案中引入任何新的符号常量(不像 WolframAlpha 暗示的但像 Mathematica)。

然而,很明显,解算法引入并可能隐藏在解中的确定的任意常数可能是由解算法引入的。这是完全有效的,因为不定积分会产生无限数量的有效解,而无需初始或最终数据。

根据MuPAD documentation of int(MATLAB 的符号引擎),不定积分是通过“表查找或 Risch 积分”解决的,我确信这是在预先进行一些前端解析和简化之后才能启动的。因此,无论符号引擎在决策树的哪个分支下落,最终都会产生三角函数的幂,这表明在减少常数时引入了常数。我不知道这是否是标准做法。但我可以看到,给算法留出一些余地来引入这些常数可能有利于稳健的求解方法,因为符号不定积分是一项极其困难的任务。

所以尝试回答这个问题:“为什么 Matlab 觉得需要提供一个积分常数,而最终它是任意的?”它这样做是因为它可以,并且底层算法出于某种原因确定它是正确的行动方案。此外,该解决方案是完全有效的,因为它是任意的。

“看起来有点危险。”我不同意。虽然不完全理想,但一旦引入适当的数据并与解决方案一起使用,集成的结果将是正确的。如果不存在这样的适当数据,则说明问题未充分说明,并且任何解决方案都对任意常数有效。

【讨论】:

  • 听起来你知道你的东西。听起来好像没有办法“关掉它”?
  • 如何让 Matlab 输出 8*cos(x) - 1/8*cos(2*x) + 65/8 而不是 17*cos(x/2)^2 - cos(x/2)^4 ?我想看看它增加的积分常数。
  • @ThatsRightJack 抱歉耽搁了;周末忘记了这个。鉴于符号不确定集成的明显复杂性以及文档中缺少选项,我怀疑它是否可以关闭。就是这样。至于简化,它可能需要一些按摩后集成,但I=int(sin(2*x)/4 - 8*sin(x));rewrite(expand(simplify(rewrite(I,'exp'))),'cos') 给出了预期的结果。
  • 不用担心。谢谢回复。我怕事情会到那个地步。我尝试了几个rewriteexpand 调用,但从未成功。我猜你放在一起的组合取决于问题。正如你所说,它就是这样。如果我真的需要知道常数,我会和 Wolfram 核对一下。不过感谢您的帮助。
  • @ThatsRightJack 抱歉回复晚了,我现在才看到这个。为什么你会说 17*cos(x/2)^2 - cos(x/2)^4 引入了一个常数,但 8*cos(x) - 1/8*cos(2*x) 没有?在我看来,任何解决方案都必然有一个任意常数,而 MATLAB 文档只说结果中没有任意的“+ 常数”。现在,如果你想“修复”这个常数,你可以使用定积分并说f(x) = int(sin(2*x)/4 - 8*sin(x),x,0,x),它会返回一个连续的 f 使得f(0)==0。 (那个 f 恰好是 -((cos(x) - 1)*(cos(x) - 31))/4。)
猜你喜欢
  • 2013-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2023-04-08
  • 1970-01-01
  • 2017-01-15
  • 2014-09-30
相关资源
最近更新 更多