4

導関数計算機の構築に興味があります。問題を解決するために頭を悩ませましたが、正しい解決策がまったく見つかりませんでした。始め方のヒントを教えてください。ありがとう

申し訳ありません!私は明らかに象徴的な微分を行いたいと思っています。

関数 f(x) = x^3 + 2x^2 + x があるとしましょう

導関数を表示したいのですが、この場合は f'(x) = 3x^2 + 4x + 1 です。

iPhone用のobjective-cに実装したいと思います。

4

6 に答える 6

7

関数の正確な導関数を見つけようとしていると思います。(記号微分)

数式を解析し、個々の操作を関数内のツリー構造に格納する必要があります。

たとえば、x + sin²(x)は演算として格納され、+と の式xおよび^(べき乗) 演算sin(x)に適用され2ます。

その後、微分規則を各ノードに適用することで、ツリーを再帰的に微分できます。たとえば、+ノードは になりu' + v'*ノードは になりuv' + vu'ます。

于 2010-05-25T14:25:36.963 に答える
4

文字列をS 式に解析します(これは通常 Lisp のコンテキストで行われますが、ほとんどすべての言語で同等のことができます)。OCaml っぽい方言では、次のようになります。

let rec derive var = function
    | Const(_) -> Const(0)
    | Var(x) -> if x = var then Const(1) else Deriv(Var(x), Var(var))
    | Add(x, y) -> Add(derive var x, derive var y)
    | Mul(a, b) -> Add(Mul(a, derive var b), Mul(derive var a, b))
    ...

(OCaml の構文がわからない場合は、-deriveは 2 つのパラメーターの再帰関数で、最初のパラメーターは変数名で、2 番目のパラメーターは連続する行で照合されます。たとえば、このパラメーターが form の構造体である場合、から構築されAdd(x, y)た構造体を返します。 Add2 つのフィールドは、値が generatedxと 派生したものです。同様に、パラメーターとして受け取る可能性yのある他のケースについても同様です。最初のパターンでは、「何にでも一致する」ことを意味します) 。derive_

この後、結果の式を整理するためのクリーンアップ関数 (分数の削減など) があるかもしれませんが、これは複雑になり、導出自体には必要ありません (つまり、それがなくても正しい答えが得られます)。

s-exp の変換が完了したら、再帰関数を使用して、結果の s-exp を文字列形式に再変換します。

于 2010-05-25T14:33:54.430 に答える
4

計算式を覚える必要があります。基本的に、基本関数の導関数の表と、複合式 ( など) の導関数の規則の 2 つが必要ですd(f + g)/dx = df/dx + dg/dx。次に、式パーサーを使用して、ツリーを再帰的に移動します。( http://www.sosmath.com/tables/derivative/derivative.html )

于 2010-05-25T14:26:56.953 に答える
2

SLaks は、記号微分の手順を既に説明しています。いくつか追加したいことがあります:

  • シンボリック数学は、主に構文解析とツリー変換です。ANTLR は両方にとって優れたツールです。この素晴らしい本言語実装パターンから始めることをお勧めします
  • あなたが望むことをするオープンソースのプログラムがあります (Maxima など)。そのようなプログラムを分析することも興味深いかもしれません (しかし、最初に自分で書いてみた方が、何が起こっているのかを理解しやすいでしょう)。
  • おそらく、出力を単純化する必要もあります。たとえば、基本的な導関数規則を式に適用するだけで、2 * xが得られ2 + 0*xます。これは、ツリー処理によっても実行できます (たとえば、0 * [...]0[...] + 0への変換など[...])。
于 2010-05-25T14:43:44.760 に答える
1

関数またはその導関数が定義されていない領域を無視して、一般的な関数 (+、-、​​、/、^、sin、cos など) の記号微分を行うのは簡単です。おそらく直観に反して難しいのは、後で結果を単純化することです。

微分を行うには、操作をツリーに (または単にポーランド語表記で) 格納し、各基本操作の導関数の表を作成します。次に、定数の導関数を 0 に設定すると共に、連鎖律と初等導関数を繰り返し適用します。これは、高速で簡単に実装できます。

于 2010-06-01T18:26:18.263 に答える
1

導関数を計算したい操作の種類は何ですか? サイン、コサイン、タンジェントなどの三角関数を許可する場合、これらはおそらくテーブルに格納するのが最適ですが、多項式などの他の関数ははるかに簡単に実行できます。f(x) だけでなく、f(x,y) など、複数の入力を持つ関数を許可していますか?

単一変数の多項式は私の提案であり、三角関数、対数関数、指数関数、およびその他の高度な関数を追加して、実行が難しい可能性のある導関数を計算することを検討してください。

于 2010-05-25T14:31:40.130 に答える