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

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

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

Spyderとは、Pythonで分析するために作られたIDEです。プログラムの編集・実行・入力補完・デバッグなどの基本的なIDE機能の他、科学用途の計算をするために要するライブラリも装備。公式・サードパーティ製のプラグインもあり、機能を拡張することもできます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

1回答

784閲覧

numpyの指数関数のオーバーフロー

yano0303

総合スコア0

Spyder

Spyderとは、Pythonで分析するために作られたIDEです。プログラムの編集・実行・入力補完・デバッグなどの基本的なIDE機能の他、科学用途の計算をするために要するライブラリも装備。公式・サードパーティ製のプラグインもあり、機能を拡張することもできます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2023/07/18 05:53

実現したいこと

実験データをまとめるために、
ある程度大きな数でも、指数関数の計算を行いたい。

前提

実験データをまとめるために、
指数関数を用いた計算を行なうコードを作成していたところ、
24行目のnp.exp()がオーバーフローしてしまった。
(コード中のデータは、オンライン上で一般に公開されているデータを使用しています。)

  • 1本目はオーバーフロー以下のため、計算できた。
  • 2本目〜5本目はオーバーフローが発生し、計算できなかった。

イメージ説明

2本目〜5本目の計算に耐えうる計算の方法が知りたいです。

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

RuntimeWarning: overflow encountered in exp denom = np.exp(const_b * const_c * (x ** (-1) - 1)) - 1

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4#x:濃度 5#xの範囲を設定 6x = np.arange(0.01, 0.07, 0.001) 7 8#定数 9#Aτ0=const_a 10#B=const_b 11 12#c:密度 13#c=const_c 14const_c = 2.6 15 16 17#y:τy 18#分子:numer 19#分母:denom 20 21#yを計算する関数を定義 22def stress_y(x, const_a, const_b, const_c): 23 numer = (const_c * (x ** (-1)) + (1 - const_c)) ** (-2) 24 denom = np.exp(const_b * const_c * (x ** (-1) - 1)) - 1 25 y = const_a * (numer / denom) 26 return y 27 28#濃度に応じた値を計算 29#1本目(0.011M) 30const_a1 = 87.83 31const_b1 = 7.03 32 33y1 = stress_y(x, const_a1, const_b1, const_c) 34 35#2本目(0.022M) 36const_a2 = 741.71 37const_b2 = 26.96 38 39y2 = stress_y(x, const_a2, const_b2, const_c) 40 41#3本目(0.033M) 42const_a3 = 3617.37 43const_b3 = 55.46 44 45y3 = stress_y(x, const_a3, const_b3, const_c) 46 47#4本目(0.044M) 48const_a4 = 16338.03 49const_b4 = 88.04 50 51y4 = stress_y(x, const_a4, const_b4, const_c) 52 53#5本目(0.055M) 54const_a5 = 302752.7 55const_b5 = 173.25 56 57y5 = stress_y(x, const_a5, const_b5, const_c)
ソースコード

試したこと

対数関数の使用は思いついたのですが、具体的な実装方法がわかりません。

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

spyderを使用しています。

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

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

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

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

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

melian

2023/07/18 06:10

dtype に np.float128 を指定すると 2本目はオーバーフローしないのですが、3〜5本目はオーバーフローしてしまいますね… x = np.arange(0.01, 0.07, 0.001, dtype=np.float128)
can110

2023/07/18 06:24

- その式で何を計算しているのか - 各変数の意味と単位 を質問本文に追記すると回答得られやすくなると思います。 また、1本目の計算で得られた結果は正しかったということでしょうか?
bsdfan

2023/07/18 22:44

計算結果はプロットしたいのでしょうか? 最終的にどういうアウトプットが欲しいかによって手段を選ぶ必要があります。
guest

回答1

0

mpmath - Python library for arbitrary-precision floating-point arithmetic を利用する場合。

python

1import numpy as np 2import mpmath 3 4mpmath.mp.dps = 50 5 6#x:濃度 7#xの範囲を設定 8x = np.arange(0.01, 0.07, 0.001) 9 10#定数 11const_c = 2.6 12 13#yを計算する関数を定義 14power_array = np.frompyfunc(mpmath.power, 2, 1) 15exp_array = np.frompyfunc(mpmath.exp, 1, 1) 16def stress_y(x, const_a, const_b, const_c): 17 numer = power_array(const_c * power_array(x, -1) + (1 - const_c), -2) 18 denom = exp_array(const_b * const_c * (power_array(x, -1) - 1)) - 1 19 y = const_a * (numer / denom) 20 return y 21 22#濃度に応じた値を計算 23#1本目(0.011M) 24 25 : 26 27# [mpf('1.7932398509323452135403010297111599472201279379812348e-789') 28# mpf('3.1689260903784489600004401703364548794600593787163488e-717') 29# mpf('5.1719326727630832701870953164567431379194547158702907e-657') 30# : 31#

投稿2023/07/18 06:45

編集2023/07/18 07:28
melian

総合スコア21118

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問