2017-10-01 11 views
-1

は私が解決しようとしている宿題であるrule-台形で機能を統合:ここではPython

最後の質問からおおよその統合方法の更なる向上をfの下の領域を分割することです(x)を等間隔のn台の台形に曲げます。

この考えに基づき、以下の式は積分を近似するために導出することができます!

https://www.dropbox.com/s/q84mx8r5ml1q7n1/Screenshot%202017-10-01%2016.09.32.png?dl=0)!

ここで、hは台形の幅であり、h=(b−a)/nxi=a+ih,i∈0,...,nは台形の辺の座標です。上記の図は、台形ルールの考え方を視覚化しています。

この式をPython関数trapezint(f,a,b,n)で実装します。 b> aかどうかを確認して確認する必要があるかもしれません。さもなければ変数を入れ替える必要があるかもしれません。

たとえば、trapezint(math.sin,0,0.5*math.pi,10)の結果は、0.9979(数値エラーあり)である必要があります。 trapezint(abs,-1,1,10)の結果は2.0にする必要があります。

これは私のコードですが、正しい値を返すようには見えません。私は1.0を取得すると仮定しています私は、私は0.18000000000000002を得る0.9979
print (trapezint(abs, -1, 1, 10))
のために取得することとしています、私は0.012286334153465965取得print ((trapezint(math.sin,0,0.5*math.pi,10)))
、については、

import math 
def trapezint(f,a,b,n): 

    g = 0 
    if b>a: 
     h = (b-a)/float(n) 
     for i in range (0,n): 
      k = 0.5*h*(f(a+i*h) + f(a + (i+1)*h)) 
      g = g + k 
      return g 
    else: 
     a,b=b,a 
     h = (b-a)/float(n) 
     for i in range(0,n): 
      k = 0.5*h*(f(a + i*h) + f(a + (i + 1)*h)) 
      g = g + k 
      return g 

print ((trapezint(math.sin,0,0.5*math.pi,10))) 
print (trapezint(abs, -1, 1, 10)) 
+0

「正しい値に到達していないようです」より具体的に指定してください。期待されるアウトプットとは何ですか?エラーメッセージが表示されましたか?もしそうなら、完全なトレースバックは何でしたか? [最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve)を参照してください。 –

+0

'return g'文がどこにあるかを見てください。また、同じコードを2つコピーしていないほうがずっと良いでしょう。 –

答えて

1

実質的には、return gステートメントは、表示されていないときにインデントされていました。

また、重複したコードを削除したので、「DRY」「原則を繰り返さない」という原則を遵守し、エラーを防ぎ、コードを簡素化して読みやすくします。

import math 
def trapezint(f, a, b, n): 

    g = 0 
    if b > a: 
     h = (b-a)/float(n) 
    else: 
     h = (a-b)/float(n) 

    for i in range (0, n): 
     k = 0.5 * h * (f(a + i*h) + f(a + (i+1)*h)) 
     g = g + k 

    return g 


print (trapezint(math.sin, 0, 0.5*math.pi, 10)) 
print (trapezint(abs, -1, 1, 10)) 

0.9979429863543573
1.0000000000000002

1

この変化は、枝の複雑さを軽減し、操作の数を減らします。最後のステップでの合計は、アレイ上の単一操作に縮小されます。

from math import pi, sin 
def trapezoid(f, a, b, n): 
    if b < a: 
     a,b = b, a 
    h = (b - a)/float(n) 
    g = [(0.5 * h * (f(a + (i * h)) + f(a + ((i + 1) * h)))) for i in range(0, n)] 
    return sum(g) 

assert trapezoid(sin, 0, 0.5*pi, 10) == 0.9979429863543573 
assert trapezoid(abs, -1, 1, 10) == 1.0000000000000002