2017-10-19 17 views
0

Je suis en train de travailler à travers un code que j'ai écrit et une ligne spécifique me donne des problèmes dans Matlab:Comment forcer Matlab pour ne pas calculer comme Inf

Ts = (1+(DatesMod.*Bs)./VolMod).^(VolMod); 

VolMod est un tableau avec des valeurs de l'ordre de 10^8, DatesMod a une plage de valeurs comprise entre 700 000 et 740 000, et Bs a une plage de valeurs comprise entre 0 et 100. Notez que cette fonction est mathématiquement similaire à faire lim (n-> Inf) (1 + B * Dates/n)^n. Je comprends que cela a principalement à voir avec les méthodes d'attribution des numéros sur l'ordinateur. Y a-t-il une manière intelligente de le forcer à calculer la valeur réelle au lieu de retourner Inf pour chaque valeur?

Merci d'avance.

Répondre

2

Notez que la limite

lim(n->Inf) (1+B*Dates/n)^n = exp(B*Dates) 

et que exp débordera à Inf une fois que l'argument est supérieur à 709.9, donc il n'y a aucun moyen de calculer exactement Ts sans arithmétique de précision arbitraire.

La meilleure option est probablement de travailler dans la précision du journal, par ex. au lieu de Ts vous travaillez avec logTs

logTs = VolMod .* log1p((DatesMod.*Bs)./VolMod) 

Vous aurez alors besoin de réécrire les expressions suivantes à utiliser sans calculer explicitement exp(logTs) (comme ce débordement de volonté).