Java で数式を実装するにはどうすればよいでしょうか?
つまり、ユーザーは複数の変数を含む文字列を入力します。単純な 2 次式のように: x^2 + 5x + 10. または Java では: (Math.pow(x,2)) + (x * 5) + 10
. ユーザーがそれを入力すると、プログラムは x を解決します。BeanShell Interpreter クラスを使用して、文字列を数式として解釈します。しかし、x についてどのように解くのでしょうか?
単純な方程式の種類に限定しない限り、これは難しい問題です。
追跡するためのいくつかのリンクを次に示します。
2 番目のリンクをたどると、3 つのオープンソース Java システムを見つけました。
SymjaプロジェクトでJava Algebra System (JAS) ライブラリを使用して、一変数多項式を解いています。
シンボリック モードの入力例:
Roots[x^2 + 5x + 10]
これは宿題ではないと思います (難しすぎます!) し、研究の問題でもないと思います (何が新しいのですか?)。そのため、問題のコンテキストによっては、最も簡単な解決策は単に活用することかもしれませんウォルフラムアルファ。
ウォルフラムアルファ:
solve x^2 + 5x + 10
x = -1/2 i (sqrt(15)-5 i) ~~ -2.5-1.93649 i
x = 1/2 i (sqrt(15)+5 i) ~~ -2.5+1.93649 i
@nuriaion が示唆するように、コンピューター代数システムを使用できると思いますが、Mathematica、Maple、Sage、または Macsyma の方が適切な提案だったと思います。他にもあります。Matlab や Octave を CAS と見なす人が多いかどうかはわかりませんが、数値計算環境に似ています。ただし、Matlab Symbolic Toolbox は、ニーズに十分な CAS 機能を提供する場合があります。
Mathematica をJavaでプログラムされたシステムに統合するのは比較的簡単です.おそらく安くはありません。
xの係数をxの累乗にマップできます。例えば; 次のような式があると仮定します。3x^2-5x+ C = 0しかし、この単純なアプローチは、小さな次数の方程式にのみ当てはまります。たとえば、私が与えた方程式は2次(最大x乗)です。したがって、xには2つの解の値があり、Vieta方程式を使用して計算できます。
PS:私は大学で数学工学を勉強していて、GnuOctaveにかなり満足しています。
1 つの可能性は、ABCL でコンパイルされた Maxima を使用して方程式を解くことです (そして必要な他の代数を実行します)。ABCL は Java での Common Lisp の実装です。フロントエンドプログラムは入力を受け取り、それを Maxima に渡して解決し、結果を表示します。基本的に、Maxima を大きな数学ライブラリとして使用できます。
中置式から後置式へ、および前後に式を変換するためのデータ構造アルゴリズムを調べたほうがよいでしょう。次に、データ構造には、式を評価するためのアルゴリズムがあります。この評価は、スタックを使用して行われます。
データ構造の本を勉強できます。書籍の中には、Ellis Horowitzによる「 Fundamentals of data structure」、Schaum の Outline of Data Structures with Javaなどがあります。