1

関数にプログラムされる積分を含む質問

これは、Python プログラミングの問題用紙からの抜粋です。次のコードがあります。

import numpy as np
from math import sin, pi

#Part a:
def f(x):
    return 2*x - x**2

def g(p,x):
    return p*sin(pi*x/2)


def hsum(p):
    s = 0
    for i,j in zip(np.arange(0,3,2E-4),np.arange(2E-4,3,2E-4)):
        delx = j - i
        ab = abs(f(i)-g(p,i))
        s += ab*delx
    return s



#print hsum(1)
#print hsum(0)        

#Part b:    
h = hsum(0)   
P = []
Q = []     
for p in np.arange(0,1.1,1E-3):
    k = hsum(p)
    if k<h:
        h = k
        P.append(hsum(p))
        Q.append(p)
print h
print min(P)
g = min(P)
t = P.index(g)
#print t
#print Q
print Q[t]

ただし、プログラムを実行すると、いわゆる最適な P に対して 0.001 の値が返されます。問題の説明によると、この値は 1 に近く、1.1 より前でなければなりません。

浮動小数点に問題があるのではないかと思いましたが、どの組み合わせを試しても同じ答えが得られます。助言がありますか?

編集:提供されたすべての提案を使用して、元のコードを編集しました。これは、かなり遅いですが (実行時間は 9:58 !!)、1.071 の正しい答えを提供します。:D

4

1 に答える 1

0

では、すべてのループ反復で にhsumリセットsします。0おそらく、ループの外でそれを上に移動する必要があります。

最適な適合を見つけるためのコードでは、p 値を P に追加していますが、適合の品質に関する情報は保持していません。min(P)最適な p ではなく、最小の p を見つけます。タプルを格納(p, hsum(p))し、H(p) 値で最小値を見つけます。min 関数は、keyそれを支援する引数を取ります。(少し単純化すると、タプルを作成する必要さえありません。)

于 2013-08-11T09:54:08.227 に答える