導関数計算機の構築に興味があります。問題を解決するために頭を悩ませましたが、正しい解決策がまったく見つかりませんでした。始め方のヒントを教えてください。ありがとう
申し訳ありません!私は明らかに象徴的な微分を行いたいと思っています。
関数 f(x) = x^3 + 2x^2 + x があるとしましょう
導関数を表示したいのですが、この場合は f'(x) = 3x^2 + 4x + 1 です。
iPhone用のobjective-cに実装したいと思います。
導関数計算機の構築に興味があります。問題を解決するために頭を悩ませましたが、正しい解決策がまったく見つかりませんでした。始め方のヒントを教えてください。ありがとう
申し訳ありません!私は明らかに象徴的な微分を行いたいと思っています。
関数 f(x) = x^3 + 2x^2 + x があるとしましょう
導関数を表示したいのですが、この場合は f'(x) = 3x^2 + 4x + 1 です。
iPhone用のobjective-cに実装したいと思います。
関数の正確な導関数を見つけようとしていると思います。(記号微分)
数式を解析し、個々の操作を関数内のツリー構造に格納する必要があります。
たとえば、x + sin²(x)
は演算として格納され、+
と の式x
および^
(べき乗) 演算sin(x)
に適用され2
ます。
その後、微分規則を各ノードに適用することで、ツリーを再帰的に微分できます。たとえば、+
ノードは になりu' + v'
、*
ノードは になりuv' + vu'
ます。
文字列を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)
た構造体を返します。 Add
2 つのフィールドは、値が generatedx
と 派生したものです。同様に、パラメーターとして受け取る可能性y
のある他のケースについても同様です。最初のパターンでは、「何にでも一致する」ことを意味します) 。derive
_
この後、結果の式を整理するためのクリーンアップ関数 (分数の削減など) があるかもしれませんが、これは複雑になり、導出自体には必要ありません (つまり、それがなくても正しい答えが得られます)。
s-exp の変換が完了したら、再帰関数を使用して、結果の s-exp を文字列形式に再変換します。
計算式を覚える必要があります。基本的に、基本関数の導関数の表と、複合式 ( など) の導関数の規則の 2 つが必要ですd(f + g)/dx = df/dx + dg/dx
。次に、式パーサーを使用して、ツリーを再帰的に移動します。( http://www.sosmath.com/tables/derivative/derivative.html )
SLaks は、記号微分の手順を既に説明しています。いくつか追加したいことがあります:
2 * x
が得られ2 + 0*x
ます。これは、ツリー処理によっても実行できます (たとえば、0 * [...]
へ0
と[...] + 0
への変換など[...]
)。関数またはその導関数が定義されていない領域を無視して、一般的な関数 (+、-、、/、^、sin、cos など) の記号微分を行うのは簡単です。おそらく直観に反して難しいのは、後で結果を単純化することです。
微分を行うには、操作をツリーに (または単にポーランド語表記で) 格納し、各基本操作の導関数の表を作成します。次に、定数の導関数を 0 に設定すると共に、連鎖律と初等導関数を繰り返し適用します。これは、高速で簡単に実装できます。
導関数を計算したい操作の種類は何ですか? サイン、コサイン、タンジェントなどの三角関数を許可する場合、これらはおそらくテーブルに格納するのが最適ですが、多項式などの他の関数ははるかに簡単に実行できます。f(x) だけでなく、f(x,y) など、複数の入力を持つ関数を許可していますか?
単一変数の多項式は私の提案であり、三角関数、対数関数、指数関数、およびその他の高度な関数を追加して、実行が難しい可能性のある導関数を計算することを検討してください。