2015-10-10 1 views
0

C'est donc une question que j'ai changé:Nombre de Approximative Euler dans le script

+0

Utilisez une boucle 'while' place avec quelque chose comme' tout prod ((1/get_fact (i)))> 1E-10' – Adriaan

+0

'1/get_fact (i)' est une valeur scalaire et non un vecteur, donc 'prod (1/get_fact (i))' aura aussi exactement la même valeur que '1/get_fact (i) 'et ne convergeront pas vers' e'. Aussi 'prod ((1/get_fact (i)))> 1E-10' est faux et ne vous dira pas que vous avez calculé' e' à 10 décimales de précision, il vous dira seulement que la valeur de 'prod ((1/get_fact (i)))> 1E-10' est supérieur à '1e-10'. – IKavanagh

+0

'alors que prod ((1/get_fact (i)))> 1E-10' me dira seulement si elle est plus grande que' 1e-10' comme l'a dit l'autre commentateur. –

Répondre

2

Tout d'abord je réécrire votre fonction pour trouver le factoriel à la plus simple

function n = factorial(n) 
    n = prod(1:n); 
end 

La boucle dans votre question n'est pas nécessaire que vous n'utilisez jamais la variable de boucle i. Je n'utiliserais cependant pas cette fonction pour ma solution car elle peut être assez lente car il faut calculer des informations redondantes à chaque itération de la boucle.

Si vous voulez continuer à utiliser une boucle for vous devez réécrire à

function f = factorial(n) 
    f = 1; % 0 factorial 
    for i = 1:n 
     f = f * i; 
    end 
end 

Vous pouvez utiliser le logarithme naturel et les règles de log s pour déterminer une valeur très précise de e avec que vous pouvez comparer contre. La valeur de e que vous pouvez vérifier est donnée par x^(1/log(x))x peut être n'importe quel nombre réel positif autre que 1, comme 2. Nous pouvons le voir dans

                                                                                                                                Rules of logs

Maintenant, comment pouvons-nous vérifier que nous avons calculé une valeur de e à 10 décimales de précision. Eh bien étant donné que b d'en haut est une représentation très précise de e nous pouvons comparer contre elle pour déterminer le moment où nous avons atteint une solution précise

x = 2; % Any positive number other than 1 
c = x^(1/log(x)); 
... 
if (abs(e - c) < 1e-10) 
    break; 
end 

Dans ma solution e est la valeur approximative que j'ai calculée à l'infini somme. Note: la valeur absolue est prise pour éviter les faux positifs lorsque e - c est un nombre négatif.


Maintenant, une méthode efficace pour calculer la somme infinie.Nous pouvons exploiter comment le factoriel est calculé pour ne pas avoir à le calculer lors de chaque itération améliorant énormément l'efficacité. Premièrement, nous avons besoin d'une variable somme, e dans mon cas, pour garder une trace de notre solution approximative. Ensuite, nous avons besoin d'une autre variable pour garder une trace de la factorielle, f dans mon cas. Comme 0 est un cas drôle, nous allons commencer avec elle

e = 0; 
f = 1; % 0 factorial 

e = e + 1/f; 

et nous avons maintenant le premier élément de notre somme infinie. Ensuite, nous pouvons utiliser la somme infinie pour calculer une approximation plus précise à e. Le factoriel peut être mis à jour à chaque itération avec f = f * n; conduisant à

for n = 1:inf 
    f = f * n; % Compute new factorial 
    e = e + 1/f; % Infinite sum 
    ... 
end 

Maintenant que mettre tout produit

x = 2; % Any positive number other than 1 
c = x^(1/log(x)); 

e = 0; 
f = 1; % 0 factorial 

e = e + 1/f; 

for n = 1:inf 
    f = f * n; % Compute new factorial 
    e = e + 1/f; % Infinite sum 
    if (abs(e - c) < 1e-10) 
     break; 
    end 
end 
+0

Je suis censé utiliser une boucle for pour calculer la factorielle, c'est pourquoi je l'ai fait de cette façon. Je reçois cependant un avertissement pour le script: Attention: l'indice de boucle FOR est trop grand. Tronquer au 9223372036854775807. > En test (ligne 9) Comment est-ce que je corrigerais ceci? –

+0

Et je veux aussi appeler ma fonction get_fact dans le script –

+0

En utilisant '9223372036854775807' au lieu de' inf'. MATLAB ne peut pas boucler à l'infini, il peut seulement boucler jusqu'à '9223372036854775807'. Cependant, c'est juste un avertissement afin que vous puissiez l'ignorer en toute sécurité. Votre fonction 'get_fact' est incorrecte alors. La boucle 'for' est inutile. Vous n'utilisez jamais 'i' et vous remplacez' nfactorial' à chaque itération. Ma solution calcule encore la factorielle avec une boucle 'for', elle le fait plus précisément. – IKavanagh