Sub Sensibilité_Aux_Conditions_Initiales() 'Il arrive que la prévision à long terme 'soit impossible (prévisions météo, par exemple) Dim u(99) Dim v(99) Dim w(99) Application.ScreenUpdating = False Sheets.Add Columns("A:C").NumberFormat = "0.000000000000" '*Conditions initiales presque identiques u(0) = 0.123456789123 v(0) = 0.123456789124 w(0) = 0.123456789122 '* Cells(1, 1) = u(0) Cells(1, 2) = v(0) Cells(1, 3) = w(0) For n = 1 To 99 u(n) = 3.96 * u(n - 1) * (1 - u(n - 1)) v(n) = 3.96 * v(n - 1) * (1 - v(n - 1)) w(n) = 3.96 * w(n - 1) * (1 - w(n - 1)) Cells(n + 1, 1) = u(n) Cells(n + 1, 2) = v(n) Cells(n + 1, 3) = w(n) Next n Columns("A:C").AutoFit ActiveWindow.ScrollRow = 57 ActiveWindow.ScrollColumn = 1 Application.ScreenUpdating = True End Sub
Serge
"garnote" a écrit dans le message de news:
Bonsoir et/ou Bonjour et/ou Bonne nuit,
Vous ne trouvez pas ça inquiétant cette affaire-là ? Comment savoir qu'une itération en virgules flottantes puisse conduire à des résultats aussi aberrants ! Parce que dans ce cas-ci ( et il y en a sûrement d'autres ), au diable les prévisions à long terme !!!
Serge
"garnote" a écrit dans le message de news: %
Merci à vous deux pour vos intéressants commentaires.
Suite à de multiples tripotages arithmétiques, j'ai constaté que, connaissant u(0) = h(0) / b(0) = 3/2 et u(1) = h(1) / b(1) = 5/3, alors u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2)) est équivalent à u(n) = h(n) / b(n) où : h(n) = h(n - 1) + 2 ^ n b(n) = h(n - 1)
Et quelle surprise de constater l'énorme différence entre les deux résultats. C'est la macro DEUX qui donne le bon résultat
Sub Virgules_Flottantes_Et_Nombres_Entiers() Sheets.Add UN DEUX End Sub
Sub UN() Dim u(20) u(0) = 3 / 2 u(1) = 5 / 3 [A5] = u(0) [B5] = u(1) For n = 2 To 19 u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2)) Cells(5, n + 1) = u(n) Next n End Sub
Sub DEUX() Dim n As Byte Dim h(20) As Long Dim b(20) As Long h(0) = 3: b(0) = 2 h(1) = 5: b(1) = 3 Cells(1, 1) = h(0): Cells(2, 1) = b(0) Cells(3, 1) = h(0) / b(0) Cells(1, 2) = h(1): Cells(2, 2) = b(1) Cells(3, 2) = h(1) / b(1) For n = 2 To 19 h(n) = h(n - 1) + 2 ^ n b(n) = h(n - 1) Cells(1, n + 1) = h(n) Cells(2, n + 1) = b(n) Cells(3, n + 1) = h(n) / b(n) Next n End Sub
Serge
Dans le même ordre d"idée :
Sub Sensibilité_Aux_Conditions_Initiales()
'Il arrive que la prévision à long terme
'soit impossible (prévisions météo, par exemple)
Dim u(99)
Dim v(99)
Dim w(99)
Application.ScreenUpdating = False
Sheets.Add
Columns("A:C").NumberFormat = "0.000000000000"
'*Conditions initiales presque identiques
u(0) = 0.123456789123
v(0) = 0.123456789124
w(0) = 0.123456789122
'*
Cells(1, 1) = u(0)
Cells(1, 2) = v(0)
Cells(1, 3) = w(0)
For n = 1 To 99
u(n) = 3.96 * u(n - 1) * (1 - u(n - 1))
v(n) = 3.96 * v(n - 1) * (1 - v(n - 1))
w(n) = 3.96 * w(n - 1) * (1 - w(n - 1))
Cells(n + 1, 1) = u(n)
Cells(n + 1, 2) = v(n)
Cells(n + 1, 3) = w(n)
Next n
Columns("A:C").AutoFit
ActiveWindow.ScrollRow = 57
ActiveWindow.ScrollColumn = 1
Application.ScreenUpdating = True
End Sub
Serge
"garnote" <garnote3@ENLEVER.videotron.ca> a écrit dans le message de news: uXqSTfhAIHA.2004@TK2MSFTNGP06.phx.gbl...
Bonsoir et/ou Bonjour et/ou Bonne nuit,
Vous ne trouvez pas ça inquiétant cette affaire-là ?
Comment savoir qu'une itération en virgules flottantes
puisse conduire à des résultats aussi aberrants !
Parce que dans ce cas-ci ( et il y en a sûrement d'autres ),
au diable les prévisions à long terme !!!
Serge
"garnote" <garnote3@ENLEVER.videotron.ca> a écrit dans le message de news: %23Z1Kt7gAIHA.5312@TK2MSFTNGP02.phx.gbl...
Merci à vous deux pour vos intéressants commentaires.
Suite à de multiples tripotages arithmétiques, j'ai constaté que,
connaissant u(0) = h(0) / b(0) = 3/2 et u(1) = h(1) / b(1) = 5/3,
alors u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2))
est équivalent à u(n) = h(n) / b(n) où :
h(n) = h(n - 1) + 2 ^ n
b(n) = h(n - 1)
Et quelle surprise de constater l'énorme différence entre les
deux résultats. C'est la macro DEUX qui donne le bon résultat
Sub Virgules_Flottantes_Et_Nombres_Entiers()
Sheets.Add
UN
DEUX
End Sub
Sub UN()
Dim u(20)
u(0) = 3 / 2
u(1) = 5 / 3
[A5] = u(0)
[B5] = u(1)
For n = 2 To 19
u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2))
Cells(5, n + 1) = u(n)
Next n
End Sub
Sub DEUX()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
h(n) = h(n - 1) + 2 ^ n
b(n) = h(n - 1)
Cells(1, n + 1) = h(n)
Cells(2, n + 1) = b(n)
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub
Sub Sensibilité_Aux_Conditions_Initiales() 'Il arrive que la prévision à long terme 'soit impossible (prévisions météo, par exemple) Dim u(99) Dim v(99) Dim w(99) Application.ScreenUpdating = False Sheets.Add Columns("A:C").NumberFormat = "0.000000000000" '*Conditions initiales presque identiques u(0) = 0.123456789123 v(0) = 0.123456789124 w(0) = 0.123456789122 '* Cells(1, 1) = u(0) Cells(1, 2) = v(0) Cells(1, 3) = w(0) For n = 1 To 99 u(n) = 3.96 * u(n - 1) * (1 - u(n - 1)) v(n) = 3.96 * v(n - 1) * (1 - v(n - 1)) w(n) = 3.96 * w(n - 1) * (1 - w(n - 1)) Cells(n + 1, 1) = u(n) Cells(n + 1, 2) = v(n) Cells(n + 1, 3) = w(n) Next n Columns("A:C").AutoFit ActiveWindow.ScrollRow = 57 ActiveWindow.ScrollColumn = 1 Application.ScreenUpdating = True End Sub
Serge
"garnote" a écrit dans le message de news:
Bonsoir et/ou Bonjour et/ou Bonne nuit,
Vous ne trouvez pas ça inquiétant cette affaire-là ? Comment savoir qu'une itération en virgules flottantes puisse conduire à des résultats aussi aberrants ! Parce que dans ce cas-ci ( et il y en a sûrement d'autres ), au diable les prévisions à long terme !!!
Serge
"garnote" a écrit dans le message de news: %
Merci à vous deux pour vos intéressants commentaires.
Suite à de multiples tripotages arithmétiques, j'ai constaté que, connaissant u(0) = h(0) / b(0) = 3/2 et u(1) = h(1) / b(1) = 5/3, alors u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2)) est équivalent à u(n) = h(n) / b(n) où : h(n) = h(n - 1) + 2 ^ n b(n) = h(n - 1)
Et quelle surprise de constater l'énorme différence entre les deux résultats. C'est la macro DEUX qui donne le bon résultat
Sub Virgules_Flottantes_Et_Nombres_Entiers() Sheets.Add UN DEUX End Sub
Sub UN() Dim u(20) u(0) = 3 / 2 u(1) = 5 / 3 [A5] = u(0) [B5] = u(1) For n = 2 To 19 u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2)) Cells(5, n + 1) = u(n) Next n End Sub
Sub DEUX() Dim n As Byte Dim h(20) As Long Dim b(20) As Long h(0) = 3: b(0) = 2 h(1) = 5: b(1) = 3 Cells(1, 1) = h(0): Cells(2, 1) = b(0) Cells(3, 1) = h(0) / b(0) Cells(1, 2) = h(1): Cells(2, 2) = b(1) Cells(3, 2) = h(1) / b(1) For n = 2 To 19 h(n) = h(n - 1) + 2 ^ n b(n) = h(n - 1) Cells(1, n + 1) = h(n) Cells(2, n + 1) = b(n) Cells(3, n + 1) = h(n) / b(n) Next n End Sub