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

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

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

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

Q&A

解決済

1回答

4056閲覧

python 方程式の解の計算方法

YYY9856

総合スコア13

Python

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

0グッド

0クリップ

投稿2018/11/29 02:58

x-cos(x) = t

といった方程式を x =...の形に書くためにコードを作成しましたが、tをt = [0,1,2,3,4,5]といった配列にするとエラーになってしまいます。
tが2などの定数だと計算ができています。
この原因を教えていただけないでしょうか?
よろしくお願いします。

python
コードリンク内容
import numpy as np
from scipy import optimize

t = [0,1,2,3,4,5]

def f(x):
return x - np.cos(x)
def g(E):
return t

def h(x):
return f(x)-g(x)

s = optimize.fsolve(h,0)

print(s)
エラー
Traceback (most recent call last):
File "optimize_test.py", line 14, in <module>
s = optimize.fsolve(h,0)
File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\site-packages\scipy\optimize\minpack.py", line 148, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\site-packages\scipy\optimize\minpack.py", line 227, in _root_hybr
ml, mu, epsfcn, factor, diag)
ValueError: The array returned by a function changed size between calls

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

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

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

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

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

guest

回答1

0

ベストアンサー

ValueError: The array returned by a function changed size between calls

x - np.cos(x) - tx - np.cos(x) は形状 (1,) の numpy 配列、t は (6,) の numpy 配列なので、ブロードキャストで返り値は (6, )の numpy 配列になってしまうことにより起きています。
複数の t に対して解を一度に求めることはできないので、以下のようにしてはどうでしょうか。

python

1import matplotlib.pyplot as plt 2import numpy as np 3from scipy import optimize 4 5def h(x, t): 6 return x - np.cos(x) - t 7 8# グラフに描画する。 9xs = np.linspace(0, 10, 100) 10ys = h(xs, t=1) 11plt.plot(xs, ys, 'b-') 12plt.hlines(0, 0, 10) 13plt.xticks(np.arange(0, 10)) 14 15ts = [0, 1, 2, 3, 4, 5] 16ret = [optimize.fsolve(h, x0=0, args=t) for t in ts] 17print(ret)
[array([0.73908513]), array([1.28342874]), array([1.78622945]), array([2.31939052]), array([3.00880353]), array([5.9425389])]

イメージ説明

追記

python

1import matplotlib.pyplot as plt 2import numpy as np 3 4xs = np.linspace(-1, 1, 20) # 引数 x の一覧 5ys = xs**3 # 各 x における関数 f(x) = x^3 の値の一覧 6 7print(xs) 8# [0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556 9# 0.66666667 0.77777778 0.88888889 1. ] 10print(ys) 11# [-1.00000000e+00 -7.16285173e-01 -4.92054235e-01 -3.20309083e-01 12# -1.94051611e-01 -1.06283715e-01 -5.00072897e-02 -1.82242309e-02 13# -3.93643388e-03 -1.45793847e-04 1.45793847e-04 3.93643388e-03 14# 1.82242309e-02 5.00072897e-02 1.06283715e-01 1.94051611e-01 15# 3.20309083e-01 4.92054235e-01 7.16285173e-01 1.00000000e+00] 16 17plt.plot(xs, ys) 18plt.show()

イメージ説明

投稿2018/11/29 03:22

編集2018/11/29 03:56
tiitoi

総合スコア21956

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

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

YYY9856

2018/11/29 03:32

ありがとうございます。まさにやりたかったことです。 初心者で大変恐縮なのですが、いくつか質問をさせていただいてもよろしいでしょうか? ①ys = h(xs, t=1)のt=1は何を示しているのでしょうか? ②このx - np.cos(x) - tのxをtの配列を入れて、x=..の形にした解をさらに計算で使いたい場合は、retを変数として使っていけばいいのでしょうか?
tiitoi

2018/11/29 03:38

t は関数の係数ですが、これも引数にして、h(x, t) としました。 h(xs, t=1) は t = 1 つまり、x - np.cos(x) - 1 のグラフを描画しています。(質問の内容とは関係ありませんが、グラフがどのような形か見るために描画しています。) > ②このx - np.cos(x) - tのxをtの配列を入れて、x=..の形にした解をさらに計算で使いたい場合は、retを変数として使っていけばいいのでしょうか? ちょっと意味がよくわからないです。 x - np.cos(x) - 0 = 0 の解 x_0 を求める。 x - np.cos(x) - x_0 = 0 の解 x_1 を求める。 x - np.cos(x) - x_1 = 0 の解 x_2 を求める。 のように求めた解を次の係数 t の値としたいということですか?
YYY9856

2018/11/29 03:42

ありがとうございます。①について理解できました。 ②ですが x - np.cos(x) - 0 = 0 の解 x_0 を求める。 x - np.cos(x) - x_0 = 0 の解 x_1 を求める。 x - np.cos(x) - x_1 = 0 の解 x_2 を求める。 この x_0, x_1, x_2 を次の計算で使いたいときということです。
tiitoi

2018/11/29 03:44

そういうことでしたら、質問のコードは ret[0] が x - np.cos(x) - 0 = 0 の解 ret[1] が x - np.cos(x) - 1 = 0 の解 ... ret[5] が x - np.cos(x) - 5 = 0 の解 となっているので、ret をそのまま次の計算に使えばよいです。
YYY9856

2018/11/29 03:50

ありがとうございました。 1週間以上悩んでいたことが一気に解決されました。 元の質問とは関係ないのですがpython勉強中のため教えていたらうれしいです。 xs = np.linspace(0, 10, 100)は xs軸の0~10までを表示という意味だと思うのですが、最後の100は100刻みという意味なのでしょうか?0~10までを表示で100刻みというのが矛盾しているように感じて。。。
tiitoi

2018/11/29 03:59 編集

区間 [0, 10] を等間隔に100分割した値の配列を作っています。 例えば np.linspace(0, 1, 5) なら array([0. , 0.25, 0.5 , 0.75, 1. ])
YYY9856

2018/11/29 04:01

納得できました。 何度も質問に答えてくださり本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問