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

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

ただいまの
回答率

88.58%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 5,411

vividevavidebu

score 13

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/07/02 22:43

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/07/02 23:11

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/06 09:44

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

    キャンセル

  • 2017/07/06 19:21

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

    キャンセル

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る