【问题标题】:Mathematica NDSolve: Is there a way to have variable coefficients?Mathematica NDSolve:有没有办法获得可变系数?
【发布时间】:2011-07-25 16:44:25
【问题描述】:

mathematica 中有没有办法为 NDSolve 提供可变系数?我需要改变系数值并创建多个图表,但除了为每个图表重新输入整个表达式之外,我无法找到一种方法来做到这一点。这是我想做的一个例子(非功能性);希望它接近工作:

X[\[CapitalDelta]_, \[CapitalOmega]_, \[CapitalGamma]_] = 
  NDSolve[{\[Rho]eg'[t] == 
          (I*\[CapitalDelta] - .5*\[CapitalGamma])*\[Rho]eg[t] - 
           I*.5*\[CapitalOmega]*\[Rho]ee[t] + 
           I*.5*\[CapitalOmega]*\[Rho]gg[t], 
    \[Rho]ge'[t] == (-I*\[CapitalDelta] - .5*\[CapitalGamma])*\[Rho]ge[t] + 
           I*.5*\[CapitalOmega]\[Conjugate]*\[Rho]ee[t] - 
           I*.5*\[CapitalOmega]\[Conjugate]*\[Rho]gg[t],
    \[Rho]ee'[t] == -I*.5*\[CapitalOmega]\[Conjugate]*\[Rho]eg[t] + 
           I*.5*\[CapitalOmega]*\[Rho]ge[t] - \[CapitalGamma]*\[Rho]ee[t],
    \[Rho]gg'[t] == I*.5*\[CapitalOmega]\[Conjugate]*\[Rho]eg[t] - 
           I*.5*\[CapitalOmega]*\[Rho]ge[t] + \[CapitalGamma]*\[Rho]ee[t],
    \[Rho]ee[0] == 0, \[Rho]gg[0] == 1, \[Rho]ge[0] == 0, \[Rho]eg[0] == 0},
    {\[Rho]ee, \[Rho]eg, \[Rho]ge, \[Rho]gg}, {t, 0, 12}];
Plot[Evaluate[\[Rho]ee[t] /. X[5, 2, 6]], {t, 0, 10},PlotRange -> {0, 1}]

这样我只需要重新调用带有系数输入的绘图命令,而不是一遍又一遍地重新输入整个序列。这会让事情变得更干净。

PS:为看起来很糟糕的代码道歉。直到现在我才意识到mathematica 没有保留字符转换。

EDIT 格式更好的版本:

【问题讨论】:

  • 我们需要一个mathematica 渲染器!和乳胶和,和!!
  • 我只是在这里猜测;你可以对系数使用设置延迟吗?我这里没有mathematica,我什至无法从01:07的SO渲染中猜出代码在做什么:)
  • @stefan 当格式化很重要时,我会发布表达式的位图。
  • @Sjoerd 是的,但是由于我们有一个数学标签,我们应该以某种方式使代码格式合理或没有标签 imo。 Mathematica 大约有 50% 的图形 :)
  • @Eliot 我编辑了您的问题以包含格式化方程式的图形。它正在等待批准。实际上,mma 转换为 ASCII 样式是有好处的。几乎没有论坛能够使用这些特殊字符。

标签: function variables wolfram-mathematica plot


【解决方案1】:

您应该只在函数定义中使用SetDelayed (":=") 而不是Set

X[\[CapitalDelta]_, \[CapitalOmega]_, \[CapitalGamma]_] := 
  NDSolve[{\[Rho]eg'[
      t] == (I*\[CapitalDelta] - .5*\[CapitalGamma])*\[Rho]eg[t] - 
      I*.5*\[CapitalOmega]*\[Rho]ee[t] + 
      I*.5*\[CapitalOmega]*\[Rho]gg[t], \[Rho]ge'[
      t] == (-I*\[CapitalDelta] - .5*\[CapitalGamma])*\[Rho]ge[t] + 
      I*.5*\[CapitalOmega]\[Conjugate]*\[Rho]ee[t] - 
      I*.5*\[CapitalOmega]\[Conjugate]*\[Rho]gg[t], \[Rho]ee'[
      t] == -I*.5*\[CapitalOmega]\[Conjugate]*\[Rho]eg[t] + 
      I*.5*\[CapitalOmega]*\[Rho]ge[t] - \[CapitalGamma]*\[Rho]ee[
        t], \[Rho]gg'[t] == 
     I*.5*\[CapitalOmega]\[Conjugate]*\[Rho]eg[t] - 
      I*.5*\[CapitalOmega]*\[Rho]ge[t] + \[CapitalGamma]*\[Rho]ee[
        t], \[Rho]ee[0] == 0, \[Rho]gg[0] == 1, \[Rho]ge[0] == 
     0, \[Rho]eg[0] == 
     0}, {\[Rho]ee, \[Rho]eg, \[Rho]ge, \[Rho]gg}, {t, 0, 12}];
Plot[Evaluate[{\[Rho]ee[t] /. X[5, 2, 6], \[Rho]ee[t] /. 
    X[2, 6, 17]}], {t, 0, 10}, PlotRange -> {0, 1}]

【讨论】:

  • 正确!有趣:查看 PlotRange -> Automatic 的绘图行为
  • @Sjoerd 收敛振荡。 PlotRange -> Automatic 让用户注意到这一点。
  • @Sjoerd 和@Alexey,我更喜欢PlotRange -> All,因为振荡是可见的,但不会超出显示范围。
  • @Sjoerdm @rcollyer 和 @Alexey 我希望它从 0 变为 1。这样所有图表都很容易比较。
  • @Elliot @rcollyer 我同意PlotRange->All 看起来更好,但在这个比例下,我们在t=2 之后看不到任何波动。在PlotRange -> Automatic 的情况下,很明显振荡发生到t=5。这对用户自己很有用,但很少用于演示目的。
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2017-10-22
  • 2019-07-05
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多