web-dev-qa-db-ja.com

Pythonで数式を解く最も簡単な方法

一連の方程式、線形、場合によっては二次方程式を解きたい。私は特に問題はありませんが、しばしばこの状況に陥っています。

MathematicaのWeb版である wolframalpha.com を使用して簡単に解決できます。しかし、それはiPython Shellの快適さと便利さを提供しません。

pythonシェルから線形および二次方程式を処理する単純なライブラリはありますか?

個人的には、Casio 991 MS関数電卓を使用すると非常に便利です。変数の設定、方程式の解法、および多くの方法を知っています。私はそのようなツールをipythonシェル内から使用できるようにしたいと考えています。何も見つけられなかったのには驚きました。私は賢者に十分感銘を受けていません。おそらく何かが足りない。

21
Lakshman Prasad

sympy はまさにあなたが探しているものです。

46
Autoplectic

最良の回答を受け入れられないものとして割り引きます。

あなたの質問は「Pythonで使用できる無料のコンピュータ代数システムが欲しい」です。

答えは「SAGEがやる」です。

あなたはマキシマ/マクシマを見ましたか? SAGEはそのためのバインディングを提供します。これは、より強力な無料のバインディングの1つです。

http://maxima.sourceforge.net/

22
Paul McMillan

Python(Sage経由)を使用して元の質問を解決する方法は次のとおりです。これは基本的に、Paul McMillanが上記で行った発言を明確にします。

sage: a,b,c = var('a,b,c')
sage: solve([a+b+c==1000, a^2+b^2==c^2], a,b,c)
[[a == 1000*(r1 + sqrt(r1^2 + 2000*r1 - 1000000))/(r1 + sqrt(r1^2 + 2000*r1 - 1000000) + 1000), b == -1/2*r1 - 1/2*sqrt(r1^2 + 2000*r1 - 1000000) + 500, c == r1], [a == 1000*(r2 - sqrt(r2^2 + 2000*r2 - 1000000))/(r2 - sqrt(r2^2 + 2000*r2 - 1000000) + 1000), b == -1/2*r2 + 1/2*sqrt(r2^2 + 2000*r2 - 1000000) + 500, c == r2]]
10
William Stein

不正確な解決策については、 線形計画法逐次二次最適化 を読んでから、そのような最適化を実行するPythonライブラリを検索してください。

方程式に整数解が必要な場合は、Python用のディオファントス方程式ソルバーを検索する必要があります。

プロジェクトオイラーに単純なソルバーを使用するのは要点がないことに注意してください。楽しく教育的な部分は、原始的な方法を使用して自分で解決する方法を学ぶことです!

7
csl

SciPy を見たことはありますか?

線形代数を解くチュートリアルの例があります:

http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html#solving-linear-system

4
Andre Miller

非線形方程式(100万以上)の大規模システムを解くための無料のWebサービスはAPMonitor.comです。ブラウザインターフェースとPython/MATLABへのAPIがあります。PythonへのAPIは単一のスクリプト(apm.py)であり、以下からダウンロードできます。 apmonitor.comのホームページ。スクリプトがPythonコードに読み込まれると、次の問題を解決できます。

  • 非線形方程式
  • 微分方程式と代数方程式
  • 最小二乗モデルのフィッティング
  • 移動範囲の推定
  • 非線形モデル予測制御
  • 等.

新しいユーザーの場合、APM Pythonソフトウェアには、ユーザーが質問を投稿できるGoogleグループフォーラムがあります。オペレーションリサーチおよびエンジニアリングにおける最適化の問題を紹介する隔週のウェビナーがあります。

以下は、最適化問題(hs71.apm)の例です。

Model

  Variables

    x[1] = 1, >=1, <=5

    x[2] = 5, >=1, <=5

    x[3] = 5, >=1, <=5

    x[4] = 1, >=1, <=5

  End Variables



  Equations

    x[1] * x[2] * x[3] * x[4] > 25

    x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40



    minimize  x[1] * x[4] * (x[1]+x[2]+x[3]) + x[3]

  End Equations

End Model

最適化の問題は、次のPythonスクリプトで解決されます。

# Import

from apm import *

# Select server

server = 'http://xps.apmonitor.com'

# Application name

app = 'eqn'

# Clear previous application

apm(server,app,'clear all')

# Load model file

apm_load(server,app,'hs71.apm')

# Option to select solver (1=APOPT, 2=BPOPT, 3=IPOPT)

apm_option(server,app,'nlc.solver',3)

# Solve on APM server

solver_output = apm(server,app,'solve')


# Display solver output

print solver_output


# Retrieve results

results = apm_sol(server,app)

# Display results

print '--- Results of the Optimization Problem ---'

print results

# Display Results in Web Viewer 

url = apm_var(server,app)

print "Opened Web Viewer: " + url
4
John Hedengren

参考: Wolfram Alpha's solution

a-1000!=0,   b = (1000 (a-500))/(a-1000),   c = (-a^2+1000 a-500000)/(a-1000)

Pythonでは、 sympyのソルバーモジュール を使用します(すべての方程式がゼロに設定されていると想定しています):

>>> import sympy
>>> a, b, c = sympy.symbols('a, b, c')
>>> sympy.solve([a + b + c - 1000, a**2 + b**2 - c**2], b, c)
[(1000*(a - 500)/(a - 1000), (-a**2 + 1000*a - 500000)/(a - 1000))]

そしてもちろん、a = 1000は2つの方程式の分母であるため、!= 1000です。

3
Nate

私は GNU Scientific Library を使い始めましたが、Cライブラリです。 Python bindings もあるようです。そのため、一見の価値があるかもしれません。

2
user59634

私は Octave を使用しますが、同意します。Octaveの構文は、私がスリル満点と呼んでいるものではありません(そして、ドキュメントは常に、彼らが助ける以上に私を混乱させます)。

1
Aaron Digulla

Pyで Bisection method を適用して、指定された間隔でルートを検索してみてください。

def f(x, rhs): # f(x) = e^x
    return math.e ** x - rhs # e^x = rhs -> e^x - rhs = 0

def solve(rhs, a = 0, b = 100, tol = 1e-3):
    while True:
        c  = (a + b) / 2.0
        if(f(a, rhs) * f(c, rhs) > 0):
            a = c
        else:
            b = c
        if(abs(f(c, rhs)) < tol):
            break
    return c

y = math.e ** 3.75 # x = 3.75
print(solve(y)) # 3.7499..
0
Mahmoud Khaled

線形方程式と二次方程式(または一般に非線形)の両方を同時に扱う統一された方法はないと思います。線形システムでは、pythonには線形代数と行列パッケージへのバインディングがあります。非線形問題はケースバイケースで解決される傾向があります。

0
Victor Liu

それはあなたのニーズに依存します:

インタラクティブなグラフィカルインターフェースが必要な場合は、sageがおそらく最良のソリューションです。

グラフィカルインターフェイスの使用を避けたいが、それでもコンピュータ代数を実行したい場合は、sympyまたはmaximaで十分です。 (sympyは非常に有望に見えますが、mathematicaを置き換える前にまだ長い道のりがあります)。

シンボリック代数は本当に必要ないが、行列でプログラムし、微分方程式を解き、関数を最小化する方法が必要な場合は、scipyまたはoctaveが優れた出発点です。

0
niels

これを見てください:

http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations

それは非常に使いやすく、非常に強力です

0
Rossella

さて、私は誤ってこのページにググっただけです。これとそのソフトウェアツールに関する多くの提案が表示されますが、実際に回答を提供するツールはありますか?実際の答えは:

[a、b、c] = [200,375,425]

どうやってこれを手に入れましたか? Maximaプログラミング言語で簡単なプログラムを作成して、「ブルートフォース」検索で見つけます。 Maxima言語に慣れ親しんでいるので、書くのに約10分しかかかりませんでした。プログラムの実行には数秒かかりました。ここにプログラムがあります:

euler_solve():= block([a、b、A、B、end:1000]、

for a thru end do
    (
    for b thru end do
        (
        c: 1000 -a -b,
        if c < 0 then
            b:end
        else if a^2 + b^2 = c^2 then
            (
            A:a,
            B:b,
            a:end,
            b:end
            )
        )
    ),
return( [A,B,c])
);

上記のコードを切り取ってwxMaximaユーザーインターフェイスに貼り付けるだけで、MS WindowsではなくUbuntuで実行できます。次に、関数名euler_solve()を入力し、returnキーを押して、数秒待ってから、outで答えをポップします。この特定の種類の問題は非常に単純であるため、任意の汎用プログラミング言語を使用して検索を実行できます。

0
R.E.H.