0

Maxima では、at() ステートメントを使用して未知数を値に置き換えることができます。しかし、これは置換のためにリストを使用し、solve() ステートメントはリストを返しません。

コード:

(%i1) g(x):=x^2+a;
                                         2
(%o1)                           g(x) := x  + a
(%i2) g(x),solve(x=3),a=2;
(%o2)                                11

コンマを使用して結果を計算することはできましたが、そのための関数を作成できません。

(%i3) f(y) := g(x),solve(x=3),a=y;
(%o3)                          f(y) := g(x)
(%i4) f(2);
                                2
(%o4)                          x  + a

コンマが行内で直接作用するように作用するステートメントはありますか?


編集:
実際には、solve() はリストのリストを返すだけなので、at() を solve() と一緒に使用して関数 f() を作成することができます。したがって、コードは次のようになります。

(%i5) f(y) := at(at(g(x), solve(x=3)[1]), a=y);
(%o5)             f(y) := at(at(g(x), solve(x = 3) ), a = y)
(%i6) f(2);
(%o6)                                 11

[1]のaftersolve(x=3)に注目してください(%i5)。リストの最初の項目(ソリューション)を選択します。

4

2 に答える 2

2

あなたが何を達成しようとしているのかわからない - おそらく、いくつかの手順をバックアップし、ここで解決しようとしているより大きな問題を説明するのが最善でしょう.

あなたが望むものについての私の最善の推測は、「解決」の結果を使用して、何らかの式に代入する値を見つけようとしているということです。もしそうなら、あなたはこのようにそれを達成することができます: f(eq, u) := map (lambda ([e], subst (e, g(u))), solve (eq, x));whereは解いて に代入eqする方程式です。'solve' は複数の解を返す可能性があるため、'map' を使用して各解に何かを適用することに注意してください。出力例を次に示します。xg(u)

(%i7) f(eq) := map (lambda ([e], subst (e, g(x))), solve (eq, x));
(%o7)       f(eq) := map(lambda([e], subst(e, g(x))), solve(eq, x))
(%i8) solve (x^2 + 2*x + 2);
(%o8)                     [x = - %i - 1, x = %i - 1]
(%i9) f (x^2 + 2*x + 2);
(%o9)                      [g(- %i - 1), g(%i - 1)]

もちろん、適切な方法で「g」を定義できます。

あなたの特定の質問(実際にはあまり関連性がないと思いますが、とにかく)に対する答えは、「ブロック」を使用して評価する式をグループ化することです。例えばf(x) := block (...);

于 2013-11-04T03:19:05.627 に答える
1

おそらく私は間違った質問に答えています。おそらくあなたが望むのはev(foo, bar, baz)、コンソール入力プロンプトでev書くときに実際に呼び出される関数です。foo, bar, bazしたがって、関数は と書かれf(y) := ev (g(x), solve(x=3), a=y)ます。

ただし、 にはさまざまな種類の機能が組み込まれてevいるため、理解しにくいことに注意してください ( のドキュメントを参照してくださいev)。代わりに、substはるかに簡単などちらを使用するかを検討してください。

于 2013-11-11T17:08:26.543 に答える