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.
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. –
@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
bien je devrais utiliser la méthode décrite dans la question – Ronnie