C'est donc une question que j'ai changé:Nombre de Approximative Euler dans le script
Répondre
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))
où x
peut être n'importe quel nombre réel positif autre que 1
, comme 2
. Nous pouvons le voir dans
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
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? –
Et je veux aussi appeler ma fonction get_fact dans le script –
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
Utilisez une boucle 'while' place avec quelque chose comme' tout prod ((1/get_fact (i)))> 1E-10' – Adriaan
'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
'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. –