一連の方程式、線形、場合によっては二次方程式を解きたい。私は特に問題はありませんが、しばしばこの状況に陥っています。
MathematicaのWeb版である wolframalpha.com を使用して簡単に解決できます。しかし、それはiPython Shellの快適さと便利さを提供しません。
pythonシェルから線形および二次方程式を処理する単純なライブラリはありますか?
個人的には、Casio 991 MS関数電卓を使用すると非常に便利です。変数の設定、方程式の解法、および多くの方法を知っています。私はそのようなツールをipythonシェル内から使用できるようにしたいと考えています。何も見つけられなかったのには驚きました。私は賢者に十分感銘を受けていません。おそらく何かが足りない。
sympy はまさにあなたが探しているものです。
最良の回答を受け入れられないものとして割り引きます。
あなたの質問は「Pythonで使用できる無料のコンピュータ代数システムが欲しい」です。
答えは「SAGEがやる」です。
あなたはマキシマ/マクシマを見ましたか? SAGEはそのためのバインディングを提供します。これは、より強力な無料のバインディングの1つです。
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]]
SciPy を見たことはありますか?
線形代数を解くチュートリアルの例があります:
http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html#solving-linear-system
非線形方程式(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
参考: 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です。
私は GNU Scientific Library を使い始めましたが、Cライブラリです。 Python bindings もあるようです。そのため、一見の価値があるかもしれません。
私は Octave を使用しますが、同意します。Octaveの構文は、私がスリル満点と呼んでいるものではありません(そして、ドキュメントは常に、彼らが助ける以上に私を混乱させます)。
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..
線形方程式と二次方程式(または一般に非線形)の両方を同時に扱う統一された方法はないと思います。線形システムでは、pythonには線形代数と行列パッケージへのバインディングがあります。非線形問題はケースバイケースで解決される傾向があります。
それはあなたのニーズに依存します:
インタラクティブなグラフィカルインターフェースが必要な場合は、sageがおそらく最良のソリューションです。
グラフィカルインターフェイスの使用を避けたいが、それでもコンピュータ代数を実行したい場合は、sympyまたはmaximaで十分です。 (sympyは非常に有望に見えますが、mathematicaを置き換える前にまだ長い道のりがあります)。
シンボリック代数は本当に必要ないが、行列でプログラムし、微分方程式を解き、関数を最小化する方法が必要な場合は、scipyまたはoctaveが優れた出発点です。
これを見てください:
http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations
それは非常に使いやすく、非常に強力です
さて、私は誤ってこのページにググっただけです。これとそのソフトウェアツールに関する多くの提案が表示されますが、実際に回答を提供するツールはありますか?実際の答えは:
[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で答えをポップします。この特定の種類の問題は非常に単純であるため、任意の汎用プログラミング言語を使用して検索を実行できます。