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

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

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

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

Q&A

解決済

3回答

3457閲覧

python3.6でシンプソンの1/3公式を利用したプログラムの実装がわかりません。

motyaa

総合スコア12

Python 3.x

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

0グッド

0クリップ

投稿2018/01/09 13:36

編集2018/01/09 14:07

###前提・実現したいこと
python3.6で1/3シンプソンの公式を利用したプログラムを実装中です。
その際、きざみ幅がhの場合の近似値vと、きざみ幅をその半分にした場合の近似値wとを計算し、|v^w| <= 10^(-10)となった場合にプログラムを終了し、その際の計算結果を出力するというものです。

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

|v^w| <= 10^(-10)となった時の分割数と近似値を出力してbreakするように実装したつもりなのですが、 実行時に何も表示されなくて困っています。

###該当のソースコード

python

1import math 2 3def f1(x): 4 return (x**3-2*x**2+x-1) 5def f2(x): 6 return (math.cos(x)) 7 8N = 10000 # 分割数 9 10a_list = [-2,0] 11b_list = [3,math.pi/2] 12cnt = 0 13for i in range(1,N,1): 14 h = (b_list[0]-a_list[0])/i # きざみ幅 15 h2 = h/2 16 v = (h/3) * (f1(h*i) + 4*f1(h*(i+1)) + f1(h*(i+2))) 17 w = (h2/3) * (f1(h2*i) + 4*f1(h2*(i+1)) + f1(h2*(i+2))) 18 if abs(v-w) <= 10**(-10): 19 print("(1)\n") 20 print("分割数 N = "+str(n)+"\n") 21 print("近似値 = "+str(v)+"\n") 22 break 23for i in range(1,N,10): 24 h = (b_list[1]-a_list[1])/i 25 h2 = h/2 26 v = (h/3) * ((f2(h*i) + 4*f2(h*(i+1)) + f2(h*(i+2)))) 27 w = (h2/3) * ((f2(h2*i) + 4*f2(h2*(i+1)) + f2(h2*(i+2)))) 28 if abs(v-w) <= 10**(-10): 29 print("(2)\n") 30 print("分割数 N = "+str(n)+"\n") 31 print("近似値 = "+str(v)+"\n") 32 break

###試したこと
for文内で|v^w|の値を出力をしてみましたが、とても10^(-10)になりそうもなく、小数点1桁くらいの大きい値が出力されました。

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

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

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

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

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

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

guest

回答3

0

可能性1:
分割数10000程度では誤差が10^(-10)にはならないので、もっとNを大きくするか許容誤差を大きくするかしなければならない
(単純にiで割り算するのではなく、ループを繰り返すごとに割る数を2倍するような処理のほうが良いかもしれない)

可能性2:
コンピューターで扱う数値の精度や演算誤差の問題
浮動小数点演算、その問題と制限

投稿2018/01/09 14:51

okrt

総合スコア366

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

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

motyaa

2018/01/09 16:12

回答ありがとうございます。 計算方法にミスがありましたが、解決することができました。
guest

0

ベストアンサー

判定条件が不明ですね。
積分としての和がありません。

私にはどう計算しているのかよく理解できませんでした。
もう少し詳しく説明していただけると要望にあった回答ができるかもしれません。

とりあえずWikipediaを参照して式を変更したところ、Scipyの積分モジュールと同じ計算結果を得ることができました。

python

1import math 2from scipy import integrate 3import numpy as np 4 5def f1(x): 6 return x**3-2*x**2+x-1 7def f2(x): 8 return np.cos(x) 9 10N0 = 100000 11a_list = [-2,0] 12b_list = [3,math.pi/2] 13 14x = np.linspace(a_list[0], b_list[0], N0) 15ans0 = integrate.simps(f1(x), x) 16print('ans0', ans0) 17 18x = np.linspace(a_list[1], b_list[1], N0) 19ans1 = integrate.simps(f2(x), x) 20print('ans1', ans1) 21 22acc = -10 23 24N = 100000 25cnt = 0 26ans0 = -99999 27for i in range(2,N,2): 28 h = (b_list[0]-a_list[0])/i 29 x = np.arange(i+1)*h + a_list[0] 30 x0 = x[2:i:2] 31 x1 = x[1:i:2] 32 v = (h/3) * (f1(x[0]) + 2*np.sum(f1(x0)) + 4*np.sum(f1(x1)) + f1(x[-1])) 33 if abs(v-ans0) <= 10**(acc): 34 print("(1)") 35 print("分割数 N = " + str(i)) 36 print("近似値 = " + str(v)) 37 break 38 ans0 = v 39 40ans1 = -99999 41for i in range(2,N,2): 42 h = (b_list[1]-a_list[1])/i 43 x = np.arange(i+1)*h + a_list[1] 44 x0 = x[2:i:2] 45 x1 = x[1:i:2] 46 v = (h/3) * (f2(x[0]) + 2*np.sum(f2(x0)) + 4*np.sum(f2(x1)) + f2(x[-1])) 47 if abs(v-ans1) <= 10**(acc): 48 print("(2)") 49 print("分割数 N = " + str(i)) 50 print("近似値 = " + str(v)) 51 break 52 ans1 = v

投稿2018/01/09 14:50

mkgrei

総合スコア8560

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

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

motyaa

2018/01/09 16:11

回答ありがとうございます。 頂いたソースコードで実行したところ、得たい結果を出力することができました。 定積分の結果とプログラムで得られた近似値の誤差も指定範囲内でしたので、解決致しました。 大変ありがとうございした。
guest

0

つw = (h/3) → (h2/3)

投稿2018/01/09 13:56

hichon

総合スコア5737

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

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

motyaa

2018/01/09 14:08

ご指摘ありがとうございます。 頂いたバグの部分を修正したのですが、変わらず何も出力されず、if文に入っていないようです。 また、プログラムを更新致しましたのでもし可能でしたらご確認下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問