Пытаюсь найти B в этом уравнении

Я пытаюсь найти переменную B в этом длинном выражении. Это дает мне ошибку, что он не может преобразовать в float. Я не совсем уверен, что именно это означает и что мне нужно сделать, чтобы исправить это и получить значение для B. Я очень новичок в Python, поэтому любая помощь будет оценена по достоинству.

Код:

import matplotlib.pyplot as plt
import numpy as np
import math
from sympy.solvers import solve
from sympy import Symbol 

W = 1*(10**(-4)) 
mu = 300  
Cox = 6.906*(10**-6)
Leff = 1*(10**(-4))
Vg1 = 0.5
Vg2 = 1.0
Vg3 = 1.5
Vg4 = 2.0
Vth = 0.0259
tsi = 5 * (10 ** -7)
Vg = [0.5, 1, 1.5, 2]
Esi = 11.7
tox = 1.5 * (10 ** -7)
tsi = 5 * (10 ** -7)
ni = 1.5 * (10 ** 10)
q = 1.602 * (10 ** -19)

B = Symbol('B')

solve((Vg1/2*Vth) - math.log((2/tsi)*(np.sqrt((2*Esi*Vth)/(ni * q)))) - 
math.log(B) + math.log(np.cos(B)) - 2*11.7*(tox)/(3.9 * tsi), B)

Ошибка:

TypeError                                 Traceback (most recent call last)
<ipython-input-3-003cda8dedbd> in <module>()
 18 B = Symbol('B')
 19 
 ---> 20 solve((Vg1/2*Vth) - math.log((2/tsi)*(math.sqrt((2*Esi*Vth)/(ni * 
  q)))) - math.log(B) + math.log(math.cos(B)) - 2*11.7*(tox)/(3.9 * tsi), B)

~\Anaconda3\lib\site-packages\sympy\core\expr.py in __float__(self)
237         if result.is_number and result.as_real_imag()[1]:
238             raise TypeError("can't convert complex to float")
 --> 239         raise TypeError("can't convert expression to float")
240 
241     def __complex__(self):

TypeError: can't convert expression to float

person Aashiv Patel    schedule 24.05.2018    source источник
comment
Пожалуйста, вставьте ошибку.   -  person Jeffrey Swan    schedule 24.05.2018
comment
Посмотрите этот пост stackoverflow.com/questions/ 22555056/   -  person Stephen Strosko    schedule 24.05.2018
comment
Вы пытаетесь использовать символические значения с обычными математическими функциями. Добавьте import sympy вверху файла и замените math.log(B) на sympy.log(B), а math.log(np.cos(B)) на sympy.log(sympy.cos(B)).   -  person jdehesa    schedule 24.05.2018
comment
Я пытался использовать sympy.log(B), но он просто продолжал загружаться и не будет вычислять никаких результатов.   -  person Aashiv Patel    schedule 24.05.2018


Ответы (1)


Как было предложено @jdehesa, используйте выражения sympy:

from sympy.solvers import nsolve
from sympy import Symbol, log, sqrt, cos

W = 1*(10**(-4)) 
mu = 300  
Cox = 6.906*(10**-6)
Leff = 1*(10**(-4))
Vg1 = 0.5
Vg2 = 1.0
Vg3 = 1.5
Vg4 = 2.0
Vth = 0.0259
tsi = 5 * (10 ** -7)
Vg = [0.5, 1, 1.5, 2]
Esi = 11.7
tox = 1.5 * (10 ** -7)
tsi = 5 * (10 ** -7)
ni = 1.5 * (10 ** 10)
q = 1.602 * (10 ** -19)

B = Symbol('B')

nsolve((Vg1/2*Vth) - sympy.log((2/tsi)*(sympy.sqrt((2*Esi*Vth)/(ni * q)))) - sympy.log(B) + sympy.log(sympy.cos(B)) - 2*11.7*(tox)/(3.9 * tsi), 1)

Выражение, которое вы пытаетесь решить, является нелинейным, поэтому вам следует попытаться решить его численно с помощью nsolve.

Примечание. Второй параметр позволяет предположить, к чему должен быть близок результат.

С 1 я получаю сложный результат:

-17910.2176436326 - 37.1544916945789*I
person Federico Corazza    schedule 24.05.2018
comment
Я понимаю, но я оставил его включенным примерно на 5 минут, и все равно ничего. - person Aashiv Patel; 24.05.2018
comment
я обновил ответ - person Federico Corazza; 24.05.2018
comment
Хорошо, но как мне теперь использовать это значение для вычисления других ответов? Потому что я назначил B для этого. - person Aashiv Patel; 24.05.2018
comment
Я не думаю, что понимаю, чего вы пытаетесь достичь, тогда - person Federico Corazza; 24.05.2018
comment
Итак, мне нужно найти B в этом выражении как нормальное значение, оно не должно быть мнимым. Потому что мне нужно использовать это значение B для вычисления некоторых других величин. - person Aashiv Patel; 24.05.2018
comment
Значение B должно быть между 0 и пи/2 или, по крайней мере, действительным числом, если это уравнение было решено правильно. - person Aashiv Patel; 24.05.2018