Как решить нелинейные уравнения с помощью цикла for в Python?

Я пытаюсь решить нелинейные уравнения в Python. Я пробовал использовать решатель Sympy, но, похоже, он не работает в операторе цикла for. Я пытаюсь найти переменную x в диапазоне входов [N].

Я прикрепил свой код ниже

import numpy as np
import matplotlib.pyplot as plt
from sympy import *

f_curve_coefficients = [-7.14285714e-02, 1.96333333e+01, 6.85130952e+03]
S = [0.2122, 0, 0]

a2 = f_curve_coefficients[0]
a1 = f_curve_coefficients[1]
a0 = f_curve_coefficients[2]

s2 = S[0]
s1 = S[1]
s0 = S[2]

answer=[]
x = symbols('x')
for N in range(0,2500,5):
    solve([a2*x**2+a1*N*x+a0*N**2-s2*x**2-s1*x-s0-0])
    answer.append(x)
    
print(answer)

Могут быть более эффективные способы решения этой проблемы, чем использование sympy *, любая помощь будет очень полезна.

Обратите внимание, что я все еще новичок в python после перехода из Matlab. Я мог бы легко решить эту проблему в Matlab и мог бы прикрепить код, но я борюсь с этим в Python


comment
Что в петле for доставляет вам проблемы? Мне кажется, это нормально. Первая итерация, N == 0, является наиболее интересной, так как некоторые термины выпадают. Решает ли это первую итерацию?   -  person CryptoFool    schedule 28.09.2020
comment
Я понимаю, в чем может быть ваша проблема. Ожидаете ли вы, что будет три уравнения, которые вы передадите для решения? Интересно, из-за того, что у вас там есть место. Вы действительно хотите поставить запятую перед этим пробелом, чтобы у вас было три уравнения вместо двух? Я вижу троих неизвестных, может, это твоя проблема.   -  person CryptoFool    schedule 28.09.2020
comment
Привет, Стив, спасибо за отзыв. Когда я запускаю код, все, что я получаю, - это x в массиве, а не значения. Должно быть только два уравнения. Я использовал запятую, чтобы разделить два уравнения. Я попробую запустить код, также удалив пробел. Посмотрим, что происходит.   -  person Mat    schedule 28.09.2020
comment
Я изменил код - теперь он должен решать одно уравнение. Но все еще не решает. Продолжает давать мне x в качестве ответа   -  person Mat    schedule 28.09.2020


Ответы (2)


Согласно этой документации, выход solve является решением. x ничего не назначено, это все равно символ.

x = symbols('x')
for N in range(0,2500,5):
    result = solve(a2*x**2+a1*N*x+a0*N**2-s2*x**2-s1*x-s0-0)
    answer.append(result)
person kutschkem    schedule 28.09.2020

Отвечая на ваш вопрос. Могут быть более эффективные способы решения этой проблемы, чем использование sympy *

вы можете использовать fsolve, чтобы найти корни нелинейного уравнения: fsolve возвращает корни (нелинейных) уравнений, определенных как func (x) = 0, с учетом начальной оценки https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html

ниже код:

from scipy.optimize import fsolve
import numpy as np

def f(variables) :
    (x,y) = variables
    first_eq = 2*x + y - 1
    second_eq = x**2 + y**2 - 1
    return [first_eq, second_eq]

roots = fsolve(f, (-1 , -1)) # fsolve(equations, X_0)
print(roots)

# [ 0.8  -0.6]
print(np.isclose(f(roots), [0.0, 0.0]))  # func(root) should be almost 0.0.

Если вы предпочитаете sympy, вы можете использовать nsolve.

>>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1])

[0.620344523485226] [1.83838393066159]

Первый аргумент - это список уравнений, второй - список переменных, а третий - первоначальное предположение.

Также для получения дополнительной информации вы можете проверить аналогичный вопрос, заданный ранее при переполнении стека, относительно способов решения нелинейных уравнений в python: Как решить пару нелинейных уравнений с помощью Python?

person mudassir ahmed    schedule 28.09.2020
comment
Спасибо за ответ на вопрос об использовании более эффективного решателя для уравнений. Мне удалось использовать ваш код с циклом for, и он работал одинаково хорошо. Я действительно вижу, что fsolve работает намного быстрее. Особенно при работе с большим диапазоном в цикле for, как в моем случае. - person Mat; 28.09.2020