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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

解決済

1回答

13645閲覧

関数定義するとfloat64ではなくObjectで扱われてしまう.

vividevavidebu

総合スコア13

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

1クリップ

投稿2017/06/30 13:24

編集2017/07/02 14:32

###前提・実現したいこと
Python初心者です.
Jupyter(IPython)で数値解析を行いたいと考えております.

###発生している問題・エラーメッセージ
定義した関数(func2)がObject型になっているため, 方程式を解く際にエラーが出てしまっていると考えられる.

-------------------------------------------------------------------------- TypeError Traceback (most recent call last) TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe' --------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-452-282e1d84ee87> in <module>() ----> 1 answer = optimize.fsolve(func2, 3) 2 3 print("Cr2 = ", answer) C:\Users\anaconda\lib\site-packages\scipy\optimize\minpack.py in fsolve(func, x0, args, fprime, full_output, col_deriv, xtol, maxfev, band, epsfcn, factor, diag) 144 'diag': diag} 145 --> 146 res = _root_hybr(func, x0, args, jac=fprime, **options) 147 if full_output: 148 x = res['x'] C:\Users\anaconda\lib\site-packages\scipy\optimize\minpack.py in _root_hybr(func, x0, args, jac, col_deriv, xtol, maxfev, band, eps, factor, diag, **unknown_options) 222 maxfev = 200 * (n + 1) 223 retval = _minpack._hybrd(func, x0, args, 1, xtol, maxfev, --> 224 ml, mu, epsfcn, factor, diag) 225 else: 226 _check_func('fsolve', 'fprime', Dfun, x0, args, n, (n, n)) error: Result from function call is not a proper array of floats. ###該当のソースコード

Python

import numpy as np import matplotlib.pyplot as plt from IPython.display import clear_output from scipy import (optimize, exp) from scipy import * %matplotlib inline from sympy import * init_printing() var("Tt2") def func1(Tt2): return Tt1*(((((ρ1*Cz1*A1*R)/(C2*A2))*(Tt2-(C2**2)/(2*Cp)))+((ρ1*Cz1*A1*C2)/(2*A2)))**((γ-1)/(γ*ec)))-(pt1**((γ-1)/(γ*ec)))*Tt2 #func1は, 与えられたC2からTt2を返す. func1(Tt2) Tt2 = np. linspace(100, 500, 1000) plt. plot(Tt2, func1(Tt2)) plt. show() ans_Tt2 = optimize.fsolve(func1, 300) #ここでfunc1は機能し, 値を返してくれる. Tt2 = ans_Tt2[0] print("Tt2 = ", Tt2) T2 = Tt2 - (C2**2)/(2*Cp) var("Cr2") #Cr2を一度変数になおす. def func2(Cr2): return Tt2-((U2^2+Cr2^2)/(2*Cp))-(T1)-(γ-1)*ε*(T1)*(ΠM^2)*(1-(Cr2/U2)*tan(βideal))*(1-(1/2)*(1+((γ-1)/2)*(M1^2))*ε*(1-(Cr2/U2)*tan(βideal))) #累乗を表すのは"*×2"ですが, ここでは"^"で表しています. Cr2以外の文字については値が実数で与えられています. func2(Cr2) #数式のチェック. Cr2 = np. linspace(-30, 100, 100) plt. plot(Cr2, func2(Cr2)) plt. show() #どんなグラフになるかを確認. グラフが生成されるのは確認済. answer = optimize.fsolve(func2, 3) print("Cr2 = ", answer) #Cr2を求める. ここでエラーが発生.

###試したこと
同じ形式でfunc1というものを作っていますが, これは正常に起動しているのを確認しました.
そこでfunc1, 2について異なる点を洗ってみたところ, func1は"float64"で表されるが, func2は"Object"で表されている事でした.
これはprint("func1", func1(Tt2).dtype)で調べました.
ほかにも, 型の変換を試みようとしましたが, 参考書でも見つからず困っている状況です.

###補足情報(言語/FW/ツール等のバージョンなど)
Jupyter Python3 notebook

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/07/02 13:43

完全なソースコードを提示していただけますか?(if __name__==__main__等)
退会済みユーザー

退会済みユーザー

2017/07/02 14:11

ソースコードを```でちゃんとくくっていただけますか?関数がどこまで定義されているのか少しわかりにくいです。
guest

回答1

0

ベストアンサー

返事が遅れて申し訳ありません。

ソースコードを実行してみたのですが、Tt1が定義されていないようです。ご質問の内容ですが、func2内の変数のどれかがobjectになっている可能性があるので調べてみてはいかがでしょうか?

投稿2017/07/04 20:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

vividevavidebu

2017/07/06 00:44

親身に解答を探してくださってありがとうございます. 関数で定義されている文字等の型を確認したところ, tan(βideal)を計算するときにnumpyを呼び出さずに記述していたのがまずかったようです. 従って"tan(βideal)"⇒"numpy. tan(βideal)"と変更することで定義関数がObjectからfloat64で扱われるようになりました. Hiroyuki827さん, ありがとうございます.
退会済みユーザー

退会済みユーザー

2017/07/06 10:21

いえいえ、私も(scipyの)勉強不足の中回答してしまっておりました。無事解決されたようでよかったです。こちらこそありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問