6

これは、この例で「functionB」として定義された関数の奇妙な結果です。誰かがこれを説明できますか?functionB[x]私はプロットしたいのですがfunctionB[Sqrt[x]]、それらは異なっている必要がありますが、このコードはそれを示していますfunctionB[x] = functionB[Sqrt[x]]。これは不可能です。

model = 4/Sqrt[3] - a1/(x + b1) - a2/(x + b2)^2 - a3/(x + b3)^4;
fit = {a1 -> 0.27, a2 -> 0.335, a3 -> -0.347, b1 -> 4.29, b2 -> 0.435,
    b3 -> 0.712};
functionB[x_] := model /. fit

Show[
 ParametricPlot[{x, functionB[x]}, {x, 0, 1}],
 ParametricPlot[{x, functionB[Sqrt[x]]}, {x, 0, 1}]
 ]

functionB[x]とは異なる必要がありますfunctionB[Sqrt[x]]が、この場合、2行は同じです(これは正しくありません)。

4

2 に答える 2

10

を試してみると?functionB、として保存されていることがわかりますfunctionB[x_]:=model/.fit。したがって、あなたが今持っているときはいつでもfunctionB[y]、どんなものに対してもy、Mathematicaはを評価しmodel/.fit、を取得し4/Sqrt[3] - 0.335/(0.435 + x)^2 + 0.347/(0.712 + x)^4 - 0.27/(4.29 + x)ます。

これは、SetDelayed(つまり:=)の使用と関係があります。functionB[x_]:=model/.fitMathematicaがパターンを見るたびに、のrhsが新たに評価されますf[_]。パターンに名前を付けたことxは関係ありません。

あなたが望むことは、例えばによって達成することができますfunctionC[x_] = model /. fit。つまり、rhsを評価するために、Set=)ではなくSetDelayed( )を使用します。:=

これが十分に明確であることを願っています(おそらくそうではありません)...

于 2011-05-18T14:56:52.807 に答える
3

functionB内でモデルを定義して、両方の場所のxが関連するようにすることをお勧めします。

fit = {a1 -> 0.27, a2 -> 0.335, a3 -> -0.347, b1 -> 4.29, b2 -> 0.435, b3 -> 0.712};
functionB[x_] := Module[
  {model = 4/Sqrt[3] - a1/(x + b1) - a2/(x + b2)^2 - a3/(x + b3)^4},
  model /. fit
]
于 2011-05-18T16:05:35.010 に答える