Самый простой способ решения математических уравнений в Python - PullRequest
21 голосов
/ 29 октября 2009

Я хочу решить ряд уравнений, линейных или иногда квадратичных. У меня нет конкретной проблемы, но часто я часто бываю в этой ситуации.

Для их решения просто использовать wolframalpha.com , веб-эквивалент Mathematica. Но это не обеспечивает комфорт и удобство оболочки iPython.

Существует ли простая библиотека для работы с линейными и квадратными уравнениями из оболочки питона?

Лично мне очень удобно использовать научный калькулятор Casio 991 MS. Я знаю, как устанавливать переменные, решать уравнения и многое делать. Мне нужен такой инструмент, который желательно использовать из оболочки ipython. Я удивлен, что не нашел ни одного. Я не достаточно впечатлен мудрецом; возможно я что-то упускаю.

Ответы [ 15 ]

46 голосов
/ 29 октября 2009

sympy это именно то, что вы ищете.

22 голосов
/ 29 октября 2009

Вы игнорируете лучший ответ как неприемлемый.

Ваш вопрос: «Мне нужна бесплатная система компьютерной алгебры, которую я могу использовать в Python».

Ответ: «SAGE делает это».

Вы смотрели на максимумы / максимы? SAGE предоставляет для него привязки, и это одна из самых мощных бесплатных привязок.

http://maxima.sourceforge.net/

10 голосов
/ 18 августа 2010

Вот как решить исходный вопрос, используя 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]]
7 голосов
/ 29 октября 2009

Для получения неточных решений, прочитайте линейное программирование и последовательная квадратичная оптимизация , а затем найдите библиотеки Python, которые выполняют такие оптимизации для вас.

Если для уравнений требуются целочисленные решения, вам следует искать решатели диофантовых уравнений для Python.

Просто отметьте, что использование простого решателя для Project Euler не имеет смысла. Забавная и образовательная часть - это научиться решать ее самостоятельно, используя примитивные методы!

4 голосов
/ 05 февраля 2012

Бесплатный веб-сервис для решения крупномасштабных систем нелинейных уравнений (более 1 миллиона) - APMonitor.com. Есть интерфейс браузера и API для Python / MATLAB. API для Python - это отдельный скрипт (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 голосов
/ 29 октября 2009

Вы смотрели на SciPy ?

В учебниках есть пример решения линейной алгебры:

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

3 голосов
/ 16 марта 2012

Для справки: Раствор Вольфрама Альфы :

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, поскольку a-1000 является знаменателем двух уравнений.

2 голосов
/ 29 октября 2009

Я только начал использовать Научная библиотека GNU , которая, однако, является библиотекой C. Похоже, есть Python привязки тоже. Так что, возможно, стоит посмотреть.

1 голос
/ 29 октября 2009

Я бы использовал Octave для этого, но я согласен, синтаксис Octave не тот, который я бы назвал захватывающим (и документы всегда смущают меня больше, чем помогают). *

0 голосов
/ 07 июня 2018

Попробуйте применить Метод деления пополам в py, чтобы найти корень с заданным интервалом:

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..
...