2010-12-18 4 views
2

Je ne pouvais pas passer du previous question parce que je n'étais pas un membre du site Web ainsi je n'ai pas pu commenter dessus quand je suis revenu. Voici ma question:Zone sous une parabole revisité

Pour trouver l'aire d'une région délimitée par le graphique y = x^2 et l'axe des x sur l'intervalle [a, b] nous pouvons approximer la région en tirant un certain nombre de " mince "rectangles et en prenant la somme de leurs domaines. Divisons [a, b] en n intervalles plus petits de même largeur h = b-1/n. Sur chaque intervalle, il y a un rectangle avec la hauteur y = r où r est le milieu de ce petit intervalle sur l'axe des x. La zone de ce rectangle est hy. Ecrivez une fonction Python qui prend a, b et n comme paramètres et renvoie la zone approximative de la région sous la parabole y = x^2 en utilisant la méthode ci-dessus. Si vous pouviez expliquer pourquoi votre programme fonctionne, ce serait utile.

Merci aux membres utiles, je trouve le programme suivant (s'il vous plaît modifier le programme car je ne peux pas/ne sais pas comment

def parabola(x): 
    y = x*x 
    return y 

def approx_area(fn, a, b, n): 
    """ 
    Approximate the area under fn in the interval [a,b] 
    by adding the area of n rectangular slices. 
    """ 

    a = float(a) 
    b = float(b) 
    area = 0.0 
    for slice in range(n): 
     left = a + (b-a)*slice/n 
     right = a + (b-a)*(slice+1)/n 
     mid = (left + right)*0.5 
     height = fn(mid) 
     width = right - left 
     area += height * width 

    return area 

    print "Area is", approx_area(parabola, -1.0, 1.0, 500) 

Cependant, il me faudrait placer cela sous une fonction entière. toutes les idées sur la façon dont je peux le faire

+0

Sommes-nous autorisés à utiliser le calcul pour trouver une formule analytique pour la zone située sous la parabole? Ce sera plus rapide et plus précis. –

+0

@Ronnie, pour entrer le code, assurez-vous qu'il y a une ligne vide avant et commencez chaque ligne avec au moins quatre espaces (plus pour obtenir un réel retrait). – paxdiablo

+0

bien je devrais utiliser la méthode décrite dans la question – Ronnie

Répondre

3

d'accord, en changeant la fonction de y = x et d'essayer des valeurs d'entrée connues, je conclus que cela fonctionne très bien:

0 .. 1 => 0.5 
0 .. 2 => 2.0 
1 .. 2 => 1.5 
0 .. 9 => 40.5 

Si vous voulez en une seule fonction, juste se débarrasser de parabola(), retirez le premier paramètre de la fonction approx_area() (et appel), puis changer:

height = fn(mid) 

à:

height = mid * mid 

comme dans :

def approx_area(a, b, n): 
    """ 
    Approximate the area under fn in the interval [a,b] 
    by adding the area of n rectangular slices. 
    """ 

    a = float(a) 
    b = float(b) 
    area = 0.0 
    for slice in range(n): 
     left = a + (b-a)*slice/n 
     right = a + (b-a)*(slice+1)/n 
     mid = (left + right)*0.5 
     height = mid * mid 
     width = right - left 
     area += height * width 

    return area 

print "Area is", approx_area(-1, 1, 500) 

Notez que je ne donne pas normalement cette aide beaucoup plus explicite pour les devoirs mais, puisque vous avez fait la majeure partie du travail vous-même, il est seulement un petit coup de coude à pus h vous à travers la ligne.

Je serait vous mettent en garde contre la remise dans ce code en l'état depuis une simple recherche sur Internet trouverez facilement ici et vos notes peuvent souffrir pour cela. Examinez-le, comprenez comment cela fonctionne à fond, puis essayez de le recoder vous-même sans regarder cette source. Cela vous aidera beaucoup plus dans votre carrière que la copie aveugle, croyez-moi.


Et si vous comprenez la théorie derrière cette méthode, tenez compte de la tranche de la fonction y = x:

7 . 
6 /| 
5/| 
    | | 
    | | 
    | | 
    | | 
    | | 
0 +-+ 
    567 

Le milieu y coordonner (et la hauteur) de la partie supérieure est (5 + 7)/2 ou 6, et la largeur est 2 donc la zone est 12.

Maintenant c'est en fait la zone réelle mais c'est seulement à cause de la formule que nous utilisons. Pour une formule non linéaire, il y aura des inexactitudes en raison de la nature de la «ligne» en haut. Plus précisément, dans votre cas, une parabole est courbée.

Mais ces inexactitudes diminuent de plus en plus et vous utilisez des tranches de plus en plus minces puisque toute ligne tend vers une ligne droite (linéaire) lorsque vous la raccourcissez. Dans le cas ci-dessus, si vous divisiez cela en deux tranches, les zones seraient 5.5 x 1 et 6.5 x 1 pour un total de 12. Si la ligne n'était pas droite, la réponse à deux tranches serait plus proche de la réalité que la réponse à une seule tranche.

Pour votre parabola (mais de x = 0 .. 1 pour rendre ma vie plus facile, il suffit de double tout pour x = -1 .. 1 car il est symétrique autour de l'axe y), le pire des cas dans une solution d'une tranche. Dans ce cas, le point milieu est à x = 0.5, y = 0.25 et, lorsque vous multipliez ce y par la largeur de 1, vous obtenez une zone de 0.25.

avec deux tranches (largeur = 0.5), les points médians se trouvent à:

x  y y x width 
---- ------ --------- 
0.25 0.0625  0.03125 
0.75 0.5625  0.28125 
       --------- 
        0.31250 

Ainsi, la zone estiment qu'il est 0.3125.

Avec quatre tranches (largeur = 0.25), les points centraux sont à:

x   y y x width 
----- -------- ---------- 
0.125 0.015625 0.00390625 
0.375 0.140625 0.03515625 
0.625 0.390625 0.09765625 
0.875 0.765625 0.19140625 
       ---------- 
       0.32812500 

Ainsi, la zone estiment dès lors 0.328125.

Avec huit tranches (largeur = 0.125), les points centraux sont à:

 x   y y x width 
------ ---------- ----------- 
0.0625 0.00390625 0.000488281 
0.1875 0.03515625 0.004394531 
0.3125 0.09765625 0.012207031 
0.4375 0.19140625 0.023925781 
0.5625 0.31640625 0.039550781 
0.6875 0.47265625 0.059082031 
0.8125 0.66015625 0.082519531 
0.9375 0.87890625 0.109863281 
        ----------- 
        0.332031248 

Ainsi, la zone estiment dès lors 0.332031248.

Comme vous pouvez le voir, cela devient de plus en plus proche de la zone réelle de 1/3 (je le sais puisque je connais le calcul, voir ci-dessous).

J'espère que cela vous aidera à comprendre le code que vous avez.


Si vous vraiment voulez savoir comment cela fonctionne, vous devez examiner le calcul, en particulier l'intégration et la différenciation. Ces méthodes peuvent prendre une formule et vous donner une autre formule pour calculer la pente d'une ligne et l'aire sous la ligne. Mais, à moins que vous ne l'utilisiez beaucoup et que vous ayez besoin d'une précision (mathématique) réelle, vous pouvez probablement utiliser les méthodes d'approximation dont vous avez besoin.

+0

Hey merci beaucoup beaucoup l'apprécier grandement – Ronnie

+0

Si cela ne vous dérange pas pouvez-vous m'expliquer comment fonctionne l'opérateur de tranche, parce que je suis incapable de choisir les bons mots pour l'expliquer – Ronnie

+0

@Ronnie, j'ai mis à jour la réponse pour montrer comment le découpage fonctionne. Soyez prudent avec la terminologie puisque Python a en fait un "opérateur" de tranche pour obtenir des tranches de tableaux (comme 'name [7: 3]'). – paxdiablo

1

Il y a aussi une bonne visualisation de ce à http://en.wikipedia.org/wiki/Integral#Formal_definitions

Nous regardons la section de la parabole entre a et b, et nous diviser en un ensemble de tranches rectangulaires verticales telles que le haut centre de chaque rectangle est exactement sur la parabole. Ceci laisse un coin de chaque rectangle "suspendu" à la parabole, et l'autre trop bas, laissant un espace non rempli; donc la zone sous la parabole est égale à la surface du rectangle, plus un peu, moins un peu. Mais comment pouvons-nous comparer les bits? La zone du rectangle est-elle un peu trop ou pas assez?

alt text

Si on trace une ligne tangente à la parabole en haut centre du rectangle, on peut « couper » le bit de recouvrement, retournez-le, et l'ajouter à l'autre côté; Notez que cela ne change pas la surface totale du rectangle (maintenant un trapèze).

alt textalt text

On peut voir maintenant qu'il ya un peu d'espace laissé de chaque côté sous la parabole, de sorte que la zone du trapézoïde est légèrement inférieure à la surface sous la parabole. Nous pouvons maintenant penser aux sommets trapézoïdaux comme formant un groupe de segments linéaires (une «approximation linéaire par morceaux») le long du bas de la parabole; et la zone sous les segments est presque la même que (mais toujours légèrement inférieure) la zone réelle que nous cherchons. Alors, comment pouvons-nous minimiser la quantité «légèrement inférieure à», pour rendre notre zone calculée plus précise? Une façon consiste à utiliser des pièces d'approximation courbes au lieu de lignes droites; cela conduit à des splines (courbes de Bézier, NURBS, etc). Une autre méthode consiste à utiliser un plus grand nombre de lignes plus courtes pour "augmenter la résolution". Calculus prend cette idée à la limite (jeu de mots), en utilisant un nombre infini de pièces infiniment courtes.

Questions connexes