Mathematica NDSolve:有没有办法变量系数?

时间:2011-03-29 23:05:43

标签: function variables wolfram-mathematica plot

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}]

通过这种方式,我只需要用系数输入重新调用plot命令,而不是一遍又一遍地重新输入整个序列。这会让事情变得更加清洁。

PS:为可怕的代码道歉。直到现在我才意识到mathematica没有保留角色转换。

编辑更好的格式化版本:

enter image description here

1 个答案:

答案 0 :(得分:2)

您应该在函数定义中使用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}]