Ответ 1
sympy - именно то, что вы ищете.
Я хочу решить набор уравнений, линейный или иногда квадратичный. У меня нет конкретной проблемы, но часто я часто бываю в этой ситуации.
Проще использовать wolframalpha.com, веб-эквивалент Mathematica, чтобы решить их. Но это не обеспечивает комфорт и удобство оболочки iPython.
Существует ли простая библиотека для работы с линейными и квадратичными уравнениями из оболочки python?
Лично мне очень удобно пользоваться научным калькулятором Casio 991 MS. Я знаю, как устанавливать переменные, решать уравнения и делать многое. Я хочу, чтобы такой инструмент можно было использовать в оболочке ipython. Я удивлен, что не нашел. Я недостаточно впечатлен мудрецом; возможно, я чего-то не хватает.
sympy - именно то, что вы ищете.
Вы отказываетесь от лучшего ответа как неприемлемого.
Ваш вопрос: "Я хочу бесплатную Систему алгебры языков, которую я могу использовать в Python".
Ответ: "SAGE делает это".
Вы посмотрели на maxima/macsyma? SAGE обеспечивает привязки для него и что один из более мощных свободных.
Вот как решить свой исходный вопрос, используя Python (через Sage). Это в основном разъясняет замечание, которое делает Пол Макмиллан.
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]]
Для неточных решений прочитайте линейное программирование и последовательная квадратичная оптимизация, затем выполните поиск библиотек Python, которые выполняют такие оптимизации для вас.
Если уравнения требуют целочисленных решений, вы должны искать решения диофантовых уравнений для Python.
Просто отметьте, что использование простого решателя для Project Euler отсутствует. Увлекательная и образовательная часть учится решать ее самостоятельно с помощью примитивных методов!
Вы посмотрели SciPy?
Он имеет пример в учебниках по решению линейной алгебры:
http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html#solving-linear-system
Бесплатный веб-сервис для решения крупномасштабных систем нелинейных уравнений (1 млн. +) - APMonitor.com. Интерфейс браузера и API для Python/MATLAB. API для Python - это единственный script (apm.py), доступный для загрузки с домашней страницы apmonitor.com. Как только script загружается в код Python, он дает возможность решать проблемы:
Для нового пользователя программное обеспечение APM Python имеет форум Google Groups, на котором пользователь может публиковать вопросы. Существуют двухнедельные вебинары, которые демонстрируют проблемы оптимизации в исследованиях и разработке операций.
Ниже приведен пример проблемы оптимизации (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 script:
# 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 solution:
a-1000!=0, b = (1000 (a-500))/(a-1000), c = (-a^2+1000 a-500000)/(a-1000)
В python, используя модуль sympy solver (обратите внимание, что он предполагает, что все уравнения установлены равными нулю):
>>> 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, а-1000 - знаменатель двух уравнений.
Я только начал использовать Научная библиотека GNU, которая, однако, является библиотекой C. Похоже, что есть Python привязки. Поэтому, возможно, стоит посмотреть.
Я бы использовал Octave для этого, но я согласен, синтаксис Octave не то, что я бы назвал захватывающим ( и документы всегда путают меня больше, чем они помогают).
Я не думаю, что существует единый способ решения как линейных, так и квадратичных (или вообще нелинейных) уравнений одновременно. С линейными системами python имеет привязки к линейной алгебре и пакетам матриц. Нелинейные задачи, как правило, решаются в каждом конкретном случае.
Это зависит от ваших потребностей:
Если вам нужен интерактивный графический интерфейс, то, вероятно, лучшим решением будет sage.
Если вы хотите избежать использования графического интерфейса, но вы все еще хотите сделать компьютерную алгебру, то sympy или maxima могут удовлетворить ваши потребности. (sympy выглядит очень многообещающим, но ему еще предстоит пройти долгий путь, прежде чем они смогут заменить математику).
Если вам действительно не нужна символическая альгребра, но вам нужен способ программирования с помощью матриц, решения дифференциальных уравнений и минимизации функций, то scipy или октава являются отличными исходными точками.
Взгляните на это:
http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations
Он чрезвычайно прост в использовании и достаточно мощный
Хорошо, я просто попал на эту страницу случайно. Я вижу много предложений относительно этого и того программного инструмента, но действительно ли какой-либо инструмент дает ответ? Фактический ответ:
[a, b, c] = [200,375,425]
Как я это понял? Написав краткую программу на языке программирования Maxima, найдите ее с помощью поиска "грубой силы". Это было всего около 10 минут, чтобы написать, видя, как я знаком с языком Maxima. Программе потребовалось несколько секунд. Вот программа:
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, который я запускаю под Ubuntu, а не с MS Windows. Затем вы просто вводите имя функции: euler_solve(), нажмите return, подождите несколько секунд и вытащите ответ. Эта конкретная проблема настолько проста, что вы можете использовать любой язык программирования общего назначения для поиска.
Во-вторых, я подробно рассмотрел мудрец и ясно, что это лучшее математическое бесплатное программное обеспечение.
Просто некоторые из различных библиотек, связанных с математикой на языке python, интегрируются в нее абсолютно потрясающе.
Пакеты математики, содержащиеся в Sage:
Algebra GAP, Maxima, Singular
Algebraic Geometry Singular
Arbitrary Precision
Arithmetic GMP, MPFR, MPFI, NTL
Arithmetic Geometry PARI, NTL,
mwrank, ecm Calculus Maxima, SymPy,
GiNaC Combinatorics Symmetrica,
Sage-Combinat Linear Algebra Linbox,
IML Graph Theory NetworkX Group
Theory GAP Numerical
computation GSL, SciPy, NumPy,
ATLAS
Другие пакеты, содержащиеся в Sage:
Command line IPython Database ZODB,
Python Pickles, SQLite Graphical
Interface Sage Notebook, jsmath
Graphics Matplotlib, Tachyon3d, GD,
Jmol Interactive
programming language Python
Networking Twisted