Sympy работает вечно, пытаясь решить это уравнение, используя сигмоидоподобную функцию - PullRequest
0 голосов
/ 21 апреля 2020

Мой ноутбук Юпитер работает и работает. Это не дает мне ответ. Я не знаю причину. Все, что вы могли бы сделать для меня, будет высоко оценено.

import sympy as sp

X, T = sp.symbols('X, T')
K = 100000*sp.exp(-33.78*(T-298)/T)
eq1 = sp.Eq(X, K/(1+K))
eq2 = sp.Eq(X**2, 0.0025*(T-300))
R = sp.solve((eq1,eq2), (X, T))
print(R)

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Вот возможный подход для решения уравнений. Сначала сделайте график обеих кривых. Вторая кривая может быть записана в виде квадрата root, если мы примем во внимание, что отрицательные результаты также применимы.

Matplotlib и numpy могут справиться с этим. Для малых значений T аргумент exp становится слишком высоким и вызывает переполнение для первого уравнения. Но для второго уравнения явно нужно, чтобы T было ≥ 300, чтобы избежать корней отрицательных чисел. Таким образом, кривые могут начинаться с T == 300.

from matplotlib import pyplot as plt
import numpy as np

T = np.linspace(300, 1000, 1000)
K = 100000 * np.exp(-33.78 * (T - 298) / T)
plt.plot(T, K / (1 + K), label='$K/(1+K)$')
plt.plot(T, np.sqrt(0.0025 * (T - 300)), label='$\\sqrt{0.0025(T-300)}$')
plt.legend()
plt.show()

Какие графики:

resulting plot

Оранжевая кривая начинается с 0 за T == 300 и продолжает расти. Синяя кривая имеет сигмовидную форму, начиная с 1, делая примерно поворот для Т между 400 и 500, а затем остается близкой к 0.

Это предполагает равенство около T == 440, которое можно включить в числовое значение симпози решатель nsolve:

import sympy as sp

X, T = sp.symbols('X, T')
K = 100000 * sp.exp(-33.78 * (T - 298) / T)

sp.nsolve(sp.Eq(K / (1 + K), sp.sqrt(0.0025 * (T - 300))), T, 440)

Результат: 443.993681772465

0 голосов
/ 22 апреля 2020

Если вы потратите время на построение графика, вы также можете использовать координату пересечения в качестве первоначального предположения для nsolve:

>>> from sympy import nsolve
>>> nsolve((eq1, eq2), (X, T), (.6, 400))
Matrix([
[0.59998683688158],
[443.993681772465]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...