Решить неявную функцию, степенную функцию с десятичными числами - PullRequest
0 голосов
/ 11 июля 2019

Я хочу представить неявную функцию, она включает в себя степенную функцию, а индекс существует в десятичных числах.

Я пытаюсь решить эту проблему с помощью scipy, но он сообщает мне недопустимое значение, обнаруженное в power, и я пытаюсь решить его с помощью sympy, но независимо от того, как долго я жду, он не может вывести ответ.

Вот неявная функция https://imgur.com/o00dQYE

#####using scipy
from scipy.optimize import fsolve
import numpy as np

global Ccu, Czn, EC50Cu, EC50Zn, bCu, bZn

Ccu = 1
Czn = 1

EC50Cu = 0.000419
bCu = 0.2388
EC50Zn = 0.9319
bZn = 0.50946

def fomula(a):
    # return Ccu/(EC50Cu * (((100-RRE)/RRE)**(1/bCu))) - 1
    return Ccu/EC50Cu + Czn/EC50Zn * a ** (1/bCu-1/bZn) - a ** (1/bCu)

a = fsolve(fomula, 0)

print(a)


#####using sympy
from sympy import *
from sympy.parsing.sympy_parser import parse_expr

EC50Cu = 0.000419
bCu = 0.2388
EC50Zn = 0.9319
bZn = 0.50946

Ccu = 1
Czn = 1

x = Symbol('x')

s = solve(Ccu/EC50Cu + Czn/EC50Zn * x ** (1/bCu-1/bZn) - x ** (1/bCu),x)
print(N(s[0],10))

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Если вы хотите получить числовой ответ, рассмотрите возможность использования nsolve, но вам потребуется первоначальное предположение ... и некоторые функции более чувствительны к этому, чем другие. Но вы можете использовать SymPy для изучения функции:

>>> eq = Ccu/EC50Cu + Czn/EC50Zn * x ** (1/bCu-1/bZn) - x ** (1/bCu)
>>> [(i, eq.subs(x,i).n(2)) for i in range(0,10,2)]
[(0, 2.4e+3), (2, 2.4e+3), (4, 2.1e+3), (6, 6.3e+2), (8, -3.6e+3)]

Похоже, что есть корень между 6 и 8:

>>> nsolve(eq, 6)
6.44945374616155
0 голосов
/ 11 июля 2019
import numpy as np

# input
Ccu,Czn = 1,1

EC50Cu = 0.000419
bCu = 0.2388
EC50Zn = 0.9319
bZn = 0.50946

# accuracy
acc = 0.001

for i in np.arange(1,99,acc):
    RRE = i
    a=Ccu/(EC50Cu * (((100-RRE)/RRE)**(1/bCu))) + Czn/(EC50Zn * (((100-RRE)/RRE)**(1/bZn)))
    if (a-1)>-acc and (a-1)<acc:
        print(i,a)

Я знал диапазон RRE, поэтому я просто прошёл этот диапазон и отфильтровал ответ по своему желанию.

...