mat*_*tek 4 wolfram-mathematica
我有以下工作Mathematica代码:
ODENInit[n_, xIni_] :=
Join[{x[1][0] == xIni}, Table[x[i][0] == 0, {i, 2, n}]]
ODEN[n_] :=
Join[{x[1]'[t] == k1 - k2 x[1][t]},
Table[x[i]'[t] == k1 x[i - 1][t] - k2 x[i][t], {i, 2, n}]]
ODENVars[n_] := Table[x[i][t], {i, 1, n}];
Manipulate[
Module[{sol},
sol = NDSolve[
Join[ODEN[10], ODENInit[10, 0]] /. {k1 -> mk1, k2 -> mk2},
ODENVars[10], {t, 0, 10}];
Plot[Evaluate@Table[x[i][t] /. sol, {i, 1, 10}], {t, 0, 10}]],
{{mk1, 1}, 0.1, 10, .1}, {{mk2, 1}, 0.1, 10, .1}]
Run Code Online (Sandbox Code Playgroud)
有没有办法重写Manipulate部分,这样我就不需要将k1和k2参数重新分配给虚拟参数,这里是mk1和mk2?感谢任何提前提示.
是的,只要让它们成为函数的参数ODEN.还有几点要改进代码:
1)通过Initialization引入函数使代码自我可靠
3)ControlType -> None用于引入虚拟本地化变量以避免额外的Module内部manipulate- 因为无论如何围绕其内容进行Manipulate包装DynamicModule.
Manipulate[
sol = NDSolve[Join[ODEN[10, k1, k2], ODENInit[10, 0]],
ODENVars[10], {t, 0, 10}];
Plot[Evaluate@Table[x[i][t] /. sol, {i, 1, 10}], {t, 0, 10}],
{{k1, 1}, 0.1, 10, .1},
{{k2, 1}, 0.1, 10, .1},
{sol, ControlType -> None},
Initialization :> {
ODENInit[n_, xIni_] :=
Join[{x[1][0] == xIni}, Table[x[i][0] == 0, {i, 2, n}]],
ODEN[n_, k1_, k2_] :=
Join[{x[1]'[t] == k1 - k2 x[1][t]},
Table[x[i]'[t] == k1 x[i - 1][t] - k2 x[i][t], {i, 2, n}]],
ODENVars[n_] := Table[x[i][t], {i, 1, n}]
}]
Run Code Online (Sandbox Code Playgroud)

要回答你的评论,如果你真的倾向于k在函数之外保持全局定义,那么这将做:
Manipulate[
Block[{sol, k1 = mk1, k2 = mk2},
sol = NDSolve[Join[ODEN[10], ODENInit[10, 0]],
ODENVars[10], {t, 0, 10}];
Plot[Evaluate@Table[x[i][t] /. sol, {i, 1, 10}], {t, 0, 10}]],
{{mk1, 1}, 0.1, 10, .1}, {{mk2, 1}, 0.1, 10, .1}]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1017 次 |
| 最近记录: |