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

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

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

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

Python

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

Q&A

解決済

3回答

2417閲覧

絶対値を含む方程式の計算におけるエラー

Homo_sapiens

総合スコア16

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2019/05/27 17:46

前提・実現したいこと

数値計算を行うのに必要な値を求めるために、絶対値記号を含む方程式を解く事が目的です。絶対値は|e*φs|で、その中の文字φsの値を,sympyのsolveメソッドを用いて方程式として求めたいのですが、エラーを吐いて計算できない状態になっています。
該当のソースコード欄には、問題が発生している部分までを記載しています。

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

NotImplementedError: solving Abs(φs) when the argument is not real or imaginary.

該当のソースコード

Python3.7

1import math 2import numpy #ここに記載されているコード中では使用しませんが 3from sympy import * 4import openpyxl 5pi=math.pi  #ここから文字の定義 6e=1.602*(10**-19) 7npe0=0 8n0=10.0*(10**-6) 9kB=1.3806 10Tpe=8.6 11Tpe0=Tpe 12Te=3000 13me=9.1094*(10**-31) 14r=0.6*(10**-7) 15φs = symbols('φs', RealNumber = True) #ここまで文字の定義 16kai=solve((e*n0*((kB*Te)/(2*pi*me))**0.5)*exp(-abs(e*φs)/(kB*Te))), φs) #方程式の記述 17print('φs='+str(kai)) #φsの値の書き出し 18#ここから先は該当コードではないため省く

試したこと

絶対値の中身を一つの文字にして(下記コードではz,fにあたる)、先に計算してから方程式に組み込んだりしてみましたが駄目でした。

φs = symbols('φs', RealNumber = True) z=e*φs f=abs(z) print('f='+str(z)) y=e*n0*((kB*Te)/(2*pi*me)**0.5)*exp(-f/(kB*Te)) print('y='+str(y)) kai=solve(e*n0*((kB*Te)/(2*pi*me)**0.5)*exp(-z/(kB*Te)), φs) print('φs='+str(φs))

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

使用している開発環境はSpyderで、Python3.7を使用しています。
PCのOSはwin10です。

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

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

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

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

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

guest

回答3

0

下記に変更して動くことは確認しました。(重いのでノーパソだと終わりません...)
・全角スペース消す
・余分な括弧消す
・RealNumber→real
・Abs→numpy.absoluteに変更(これが必須のようです)

import math import numpy from sympy import * 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(-numpy.absolute(e*φs)/(kB*Te)) kai = solve(f, φs) print('φs='+str(kai))

投稿2019/05/28 01:05

編集2019/05/28 01:10
jeanbiego

総合スコア3966

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

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

jeanbiego

2019/05/28 01:07

あ、すいません。tetsunosukeさんのと重複してますね。
Homo_sapiens

2019/05/28 07:43

ご回答ありがとうございます。 こちらが使用しているPCはノートPCで、メモリ8GB, CPUはintel Corei7 8th Genです。 これまで何度か計算が終わらなかったので何事かと思っていましたが、 やっぱり重たいという事でしたか… ご回答いただいたコードも現在ためしていますが、計算が終わりません… 何とか軽量化する方法を検討したいと思います。
guest

0

解こうとしている方程式が複雑なので単純化しますが、これで解決しませんかね

python3

1import math 2from sympy import * 3import numpy as np 4x = symbols('x', real = True) # ここが間違い? 5kai = solve(np.absolute(x)-1, x) #np.absoluteじゃなくて absでも解けるかも 6print(kai)

ちなみにリファレンスはこれっすね。
https://docs.sympy.org/latest/modules/core.html?highlight=symbols#sympy.core.symbol.symbols
RealNumberという表記はどこから持ってきたのだろう?

投稿2019/05/28 00:28

編集2019/05/28 00:42
tetsunosuke

総合スコア1292

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

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

Homo_sapiens

2019/05/28 06:52

tetsunosukeさん 汎用性に富むご回答ありがとうございます。 リファレンスも大変ありがたいです。 現在、ご回答いただいたコードを組み込んでプログラムをまわしていますが、計算が終わらないので、 取り急ぎですが御礼申し上げます。 RealNumberという表記ですが、こちらのURLを基にしました。https://stackoverflow.com/questions/33188668/how-to-solve-absolute-value-equations-using-sympy
tetsunosuke

2019/05/28 07:16

ですよねー。私もちょっと計算回してみて諦めましたw StackOverflowの内容ですが、RealNumberでうまくいかないよ!って書いてあって、real=Trueだったわ!って自己解決してますね。
Homo_sapiens

2019/05/28 08:37

あ、やっぱり時間かかりましたか… 何とかして軽量化できる記述を検討したいと思います。 StackOverflowはしっかり読めてませんでした…
guest

0

自己解決

tetsunosukeさんと、jeanbiegoさんの回答により問題は解決しましたが、
解を一つだけに絞りたかったのでもう少し調べを進めてみました。

すると、下記URLにあるように、real = True を positive= True にすることで、正の値のみを得られることがわかりました。
https://teratail.com/questions/163372

ベストアンサーの決定は甲乙付け難く非常に迷いましたが、tetsunosukeさんのをベストアンサーとしたいと思います。

import math from sympy import * import numpy as np x = symbols('x', positive= True)#ここをいじりました。 kai = solve(abs(x)-1, x)#absでもやっぱりいけるようです print(kai)#kaiが[1]として表示される。

投稿2019/05/28 08:56

Homo_sapiens

総合スコア16

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

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

tetsunosuke

2019/05/28 14:55

お、absで解けたんですね。 式の計算量とかに関係があったりオプションでGPU使いだしたりすると、とかはあるのかもしれませんね。 今回提示された方程式については知識がないのでよくわかりません(いや、私もsympy初めて触ったんですけど)が、きれいに解決してよかったです。(実はリファレンス探してくるのも少しだけ苦労した)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問