質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7505閲覧

sympyでTypeError:can't convert expression to float の解決方法

Homo_sapiens

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/05/28 18:11

編集2019/05/28 18:16

前提・実現したいこと

物理現象の数値解析のためにプログラムを書いています。
最終的にエクセルに計算結果を出力したりするのですが、
その仮定で求める必要のある数値を得ようとするとエラーが発生します。

発生している問題・エラーメッセージ

発生している問題は2点あり、
①「Jsec」の値が求まらず、式がそのまま表示される。
②下記のようなエラーの発生。

raise TypeError("can't convert expression to float") TypeError: can't convert expression to float

該当のソースコード

import numpy as np from sympy import * import openpyxl#ここに記載してるコードの後で使用 import math pi=math.pi#ここから各値の設定 e=1.602*(10**-19) npe0=0 n0=10.0*(10**-6) kB=1.3806 Tpe=8.6 Tpe0=Tpe Te=3000 me=9.1094*(10**-31) r=0.6*(10**-7) φs = symbols('φs', real=True)#ここまで値の設定 f=e*n0*((kB*Te)/(2*pi*me)**0.5)*exp(-abs(φs*e)/(kB*Te)) print('f='+str(f)) a=2.7734*10**-6#ここから各値の設定 b=-3.8679*10**-23 c=abs(φs) print('c='+str(c)))#ここまで値の設定 f=a*exp(b*abs(φs)) kai=solve(f,φs) print('φs='+str(φs)) T=290#ここから各値の設定 Vφ=4.52 A=1.20*(10**6)#ここまで値の設定 Je=A*(T**2)*math.exp(-(e*Vφ)/(2*pi*T)) Ie=Je*(4*pi*(r**2)) print('Je='+str(Je)) print('Ie='+str(Ie)) u=symbols('u')#ここから各値の設定 Em=2000 kB=1.3806 Te=12.1#ここまで値の設定 F5= integrate(( (u**5)*exp(-(Em/(4*kB*Te)*(u**2)+u)), 0, oo)) print ('F5='+str(F5)) δm=1.2#値の設定 Jsec=3.7*δm*Je*math.exp(-(abs(e*φs))/(kB*Te))*(Em/(kB*Te))*F5 Isec=Jsec*(4*pi*(r**2))#ここでエラーが発生する print('Jsec='+str(Jsec))#ここの表示はされるが、求まっていないのでエラーが発生している? print('Isec='+str(Isec))#Isecのエラーにより表示できない #実際はここから先もコードが続きます。

試したこと

和訳すると、「表現をfloatに変換できない」というエラーだったので、なら最初から全部floatにすれば変換の必要ないんじゃね?と思って、int型になっているものをfloat型に表記しなおしてみましたが結果は変わりませんでした。何気にkaiの値が[]と表示されているのがどういう意味なのか分からないです。(kai=0の意味でしょうか)

変更前↓
変更前
変更後↓(結局floatにしても実行後にint型に変更されてしまう模様)
変更後

補足情報(FW/ツールのバージョンなど)

Python3.7のSpyderを使用してコードを書いています。Anacondaに同梱されているやつです。
使用PCはwin10、intel corei7 8th Gen
メモリは8GBのノートPCを使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

トレースバックをよく見ましょう。エラー行が書いてあります。

Traceback (most recent call last): File ".py", line 43, in <module> Jsec=3.7*δm*Je*math.exp(-(abs(e*φs))/(kB*Te))*(Em/(kB*Te))*F5 File "C:...\site-packages\sympy\core\expr.py", line 256, in __float__ raise TypeError("can't convert expression to float") TypeError: can't convert expression to float

例外を投げているのはJsecに値を束縛している行です。

和訳すると、「表現をfloatに変換できない」というエラーだった

ここでのexpressionは『式』と訳した方が良いでしょうね。

Python

φs = symbols('φs', real=True)

φsはシンボルです。数値ではありません。

Python

Jsec=3.7δmJemath.exp(-(abs(eφs))/(kBTe))(Em/(kB*Te))*F5

シンボルを含むので、-(abs(eφs))/(kBTe) は式です。数値ではありません。
math.expにsympyの式を処理する機能はありません。

代わりにsympy.expを使ってやれば良いです。

Python

1from sympy import * 2... 3Jsec=3.7*δm*Je*exp(-(abs(e*φs))/(kB*Te))*(Em/(kB*Te))*F5

投稿2019/05/28 22:37

LouiS0616

総合スコア35676

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Homo_sapiens

2019/05/29 01:55

ご回答ありがとうございます。 なるほど、expはmathだけではなくsympyからも使用できたのですか…。 おかげさまで問題が解決しました!
LouiS0616

2019/05/29 01:58

基本的にsympyオブジェクトはsympyで用意されている関数で計算します。 全てのシンボルの値が既知であるときは数値化することができるので、適切にmathやnumpyに繋げてくれているだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問