Python: определитель, матрица, не может преобразовать выражение в число с плавающей точкой - PullRequest
0 голосов
/ 17 октября 2018

Я пишу короткую программу, которая должна найти значение, для которого действительная и мнимая части функции равны нулю.Я не понимаю, почему я получаю «не могу преобразовать выражение в float» после запуска программы.(Пожалуйста, простите мою путаницу при написании кода!) Я обрезал определения символов a11-a88, чтобы спасти вас от чтения, но все они имеют тип A cmath.exp (b x), A1 *cmath.exp (1,0j * b1 * x) или 1,0j * A2 * cmath.exp (1,0j * b2 * x).Я последовательно использую функцию cmath вместо математики (cmath.exp не exp и cmath.sqrt не sqrt).

import sys
import math
from scipy import *
from numpy.linalg import *
from sympy import *
import numpy
from sympy.solvers import solve
import cmath
from scipy import optimize

plik=open('solution_e-.txt','w')

#I cut-off definitions of symbols a11-a88.

Det =((a77*a88+(-1.0)*a78*a87)*(a44*a55*a66+a45*a56*a64)+(a76*a88+(-1.0)*a78*a86)*(a44*a57*a65+a45*a54*a67))*(a11*(a22*a33+(-1.0)*a23*a32)+a21*(a13*a32+(-1.0)*a12*a33))+((a77*a88+(-1.0)*a78*a87)*(a34*a56*a65+a35*a54*a66)+(a76*a88+(-1.0)*a78*a86)*(a34*a55*a67+a35*a57*a64))*(a11*(a22*a43+(-1.0)*a23*a42)+a21*(a13*a42+(-1.0)*a12*a43))+((a77*a88+(-1.0)*a78*a87)*(a44*a56*a65+a45*a54*a66)+(a76*a88+(-1.0)*a78*a86)*(a44*a55*a67+a45*a57*a64))*(a11*(a23*a32+(-1.0)*a22*a33)+a21*(a12*a33+(-1.0)*a13*a32))+((a77*a88+(-1.0)*a78*a87)*(a34*a55*a66+a35*a56*a64)+(a76*a88+(-1.0)*a78*a86)*(a34*a57*a65+a35*a54*a67))*(a11*(a23*a42+(-1.0)*a22*a43)+a21*(a12*a43+(-1.0)*a13*a42))

equat = Det.real + Det.imag


for i in range (76500,76550,1):
    n=i/100000.0

    equat_lam = lambdify(x,equat)
    Solut = optimize.fsolve(equat_lam, n)
    plik.write(str(float(Solut))+'\n')
    print n



plik.close()

Редактировать: полный возврат ошибки

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\Anaconda\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc)
    195             else:
    196                 filename = fname
--> 197             exec compile(scripttext, filename, 'exec') in glob, loc
    198     else:
    199         def execfile(fname, *where):

C:\Users\Melania\Documents\doktorat\2017\analiza\Próbka I\poziomy_en\rozwiazanie_elektrony.py in <module>()
     33 print 'I defined other symbols'
     34 
---> 35 k1=(cmath.sqrt(2.0*(V1-x)*m))/hkr
     36 k2=(cmath.sqrt(2.0*(V2-x)*m))/hkr
     37 k3=(cmath.sqrt(2.0*x*m))/hkr

C:\Anaconda\lib\site-packages\sympy\core\expr.pyc in __complex__(self)
    210         result = self.evalf()
    211         re, im = result.as_real_imag()
--> 212         return complex(float(re), float(im))
    213 
    214     @_sympifyit('other', False)  # sympy >  other

C:\Anaconda\lib\site-packages\sympy\core\expr.pyc in __float__(self)
    205         if result.is_number and result.as_real_imag()[1]:
    206             raise TypeError("can't convert complex to float")
--> 207         raise TypeError("can't convert expression to float")
    208 
    209     def __complex__(self):

TypeError: can't convert expression to float

1 Ответ

0 голосов
/ 03 ноября 2018

Трассировка начинается с

C:\Users\...
k1=(cmath.sqrt(2.0*(V1-x)*m))/hkr

и в конце вы видите

TypeError: can't convert expression to float

, вызванный expr.__float__ от Sympy, который был вызван expr.__complex__, так что можно сделать вывод, чтовыражение 2.0*(V1-x)*m не может быть преобразовано в комплексное число - обычно это происходит потому, что оно содержит свободный символ.

Если вы хотите численно вычислить квадратный корень, вы должны подставить числовое значение для всех символов, которые составляютаргумент cmath.sqrt, где каждый термин, например, V1, может быть символическим выражением, содержащим большое количество символов.

Тем не менее, если вы хотите "найти значение, для которого действительная и мнимая части функции равны нулю" , очевидно, вам не следует писать equat = Det.real + Det.imag

...