質問

簡単に聞こえるが、プログラムしようとすると見た目がよくないことを行う方法について、誰かが情報や経験を持っているかどうか知りたいです。 アイデアは次のとおりです。たとえば、「2 * x= 10」などの方程式を含む文字列を指定します(これは単純ですが、sqrt(54)* 35= x ^ 2などのように非常に複雑になる可能性があります。on ....)そしてプログラムはx= 5を返し、おそらく彼がそこにたどり着いた方法のログを提供します。

これは実行可能ですか?もしそうなら、誰かがリードを持っていますか?詳細については、このサイト( http://www.numberempire.com/equationsolver.php )があります。)これはPHPでも同じことをしますが、オープンソースではありません。

助けてくれてありがとう!

役に立ちましたか?

解決

これは「構文解析」と呼ばれ、コンピュータサイエンスはすでにこの問題を解決していますが、完全に理解するまではまったく簡単ではありません。この問題を解決する方法を説明するコンピュータサイエンスの分野全体があります。Cでは、入力の文法を定義し(おそらく優先ルールを使用して)、入力に対して字句解析を実行し、結果を解析して、最後に解析を評価する必要があります。ツリー。

ただし、Rubyなどの言語では、文字列操作を完全にサポートしており、実行時の能力が非常に高いため、次のように1行のコードで問題を解決できます。 ジェネラコディセタグプレ

はい、それはあなたが求める以上のものをカバーします。

他のヒント

まず、入力として使用できる方程式の種類を適切に定義する必要があります。次に、方程式を表すための適切な抽象化を作成する必要があります。多項式クラス。より複雑な式を使用したい場合は、数値式のツリーを探してください。式をプレフィックス表記に変換するための適切なルールがあれば、解析は非常に簡単です。スタックを使用すると、評価が簡単になります。人工的なツリーまたは多項式を取得したら、変換を実装して変数を計算できます。

方程式が複雑になった場合、C / C ++コードが数行になることは間違いありません。

線形方程式の場合、線形代数の本で説明されている方法の1つをシミュレートする必要があります。そのコードは十分に小さいです。

SymPyでC(またはC ++)コードにリンクし、それを使用して方程式を解いてみることができます。

IIRC、SymPyにはそのような機能があります。さらに、Python内で使用可能な方程式への入力文字列を操作し、それをSymPyに渡して解く方が簡単なはずです。

問題には2つの部分があります。方程式を解析することと、それらを象徴的に解くことです。他の回答がすでにそのトピックを十分にカバーしているので、私は最初のものについて多くを言うつもりはありません。私の個人的な推奨事項は、接頭辞表記の式用の単純な再帰下降パーサーを作成することです。

2番目の部分、方程式を解析的に解くのは難しいでしょう。一般的に言えば、解析解を見つけるための標準的な方法が存在する特別なクラスの方程式があります。

  • 連立一次方程式:任意の直接線形ソルバー。ステップを明示的に示したいが、方程式/未知数の数が少ない場合は、ピボットされていないガウスの消去法やクラメルの公式などの単純なものをお勧めします。
  • 多項式のシステム:変数置換後、単一の多項式の根を見つけることと同等です。これらの次数が4未満の場合、正確な解の公式があります。注意:次数3および4の場合、これらの式は快適ではありません。
  • 有理係数を持つ多項式のシステムの有理解:上記のように変数置換を行います。次に、有理ゼロテストを使用したブルートフォース。
  • 他の種類の方程式:頑張ってください。より複雑な[システムの]非線形方程式について、数値(非分析)解法で解決できる場合は、ニュートン法を調べてください。

1つの修正:これは線形代数ではありません。これは通常、複数の方程式と未知数の行列を意味します。

あなたの例は確かに複雑ではありません。

必要なのは、単純な式の文法とパーサーです。方程式を抽象構文ツリーに解析し、ツリーをたどって評価します。

Javaを作成している場合は、これ。もう1つの例は、 symja です。おそらく、C ++用に独自のものを考え出すのに十分なインスピレーションになるでしょう。

MathematicaとWolframのAlphaも調べてみてください。スティーブンウルフラムは、世界で最も優れた数学者およびコンピューター科学者の1人です。彼は、自分で書くのではなく、再利用して有利に利用できるものをたくさん持っています。

「解決する」とはどういう意味で、何が返ってくると期待するかを定義する必要があります。

記号解と数値解があります。どちらの意味ですか?どちらも同じように有効ですが、異なります。答えに応じて、さまざまな手法を適用します。

もう1つのポイント:方程式のタイプに大きく依存する方程式を「解く」ための多くの手法があります。 f(x) = 0のようなものを教えていただければ、ニュートン法のような求根アルゴリズムを思い浮かべます。常微分方程式を教えていただければ、ルンゲクッタ法を使った置換法や数値積分を試すかもしれません。偏微分方程式を教えていただければ、有限差分法、有限要素法、または境界要素法を適用できます。 (楕円、放物線、双曲型の偏微分方程式を始めないでください。)

要点は、あなたの質問は非常に一般的であり、答えはあなたがやろうとしていることに大きく依存するということです。詳細が役立つ場合があります。

一般に、式を解析して内部表現にする必要があります。多くの線形代数の本は、係数を表すために行列(またはstd::vector)を使用することを提案しています。項の指数は、ベクトル内の位置によって定義されます。

たとえば、次の式: ジェネラコディセタグプレ

配列またはstd::vectorとして表すことができます: ジェネラコディセタグプレ

評価関数の記述は簡単になり、読者の練習問題として残されます。

複数の方程式を解くことはより複雑になります。このための既存のライブラリとアルゴリズムがあります。 Google検索で何か良いものが見つかるはずです。 :-)

簡単な用語から始めて、そのためのパーサーを作成することをお勧めします。それが機能したら、関数名も受け入れるようにパーサーを変更できます。

=の両側に用語がある式を単純化しようとしている場合は、手作業で解くときに通常実行する手順を書き留めてください。いくつかのルールを理解するために、いくつかの異なる方程式を試してください。これらのルールをC ++で実装します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top