2010-06-27 6 views
0

J'ai le code simple suivant dans mathematica qui est ce que je veux à une seule sortie. Mais je veux en avoir des centaines ou des milliers. Comment puis-je faire?automatiser une procédure mathématique: J'ai besoin d'amouts industriels de résultats, et je reçois un

Clear["Global`*"] 


k = 2; Put["phiout"]; Put["omegadiffout"]; 

Random[NormalDistribution[0, 0.1]]; 

For[i = 1, i < 31, 
rnd[i] = Random[NormalDistribution[0, 0.1]]; i++] 

Table[rnd[i], {i, 1, 30}] 

For[i = 1, i < 30, 
rnddf[i] = rnd[i + 1] - rnd[i]; i++ 
] 

diffomega = Table [rnddf[i], {i, 1, 29}]; 


Table[ 
    Table [rnddf[i], {i, 1, 29}], {j, 1, 100}]; 

PutAppend[Table[ 
    diffomega, {j, 1, 100}] , "diffomega"] 


eqs0 = Table [ 
    k*phi[i + 1] + k*phi[i - 1] - 2*k*phi[i] - rnddf[i] == 0, {i, 1, 
    28}]; 

eqs1 = eqs0 /. {phi[0] -> phi[30], phi[31] -> phi[1]}; 

Sum[phi[i], {i, 1, 29}]; 

eqs2 = Append[eqs1, - phi[1] - phi[27] - 3 phi[29] == 0]; 

eqs3 = eqs2 /. {phi[30] -> -Sum[phi[i], {i, 1, 29}]}; 

vars = Table [phi[i], {i, 1, 29}]; 

eqs = NSolve[eqs3, vars]; 

PutAppend[diffomega, eqs , "phiout"] 

Cela a mis sur le fichier "phiout" et "omegadiffout" seule la dernière valeur. J'ai besoin de centaines d'entre eux. Pour chaque génération aléatoire, j'ai besoin d'une sortie.

Merci à l'avance

+0

Que fait la troisième ligne? Aussi, pourriez-vous * indenter * les corps des boucles? C'est difficile à lire. – Allen

+0

Pour le moment vous ne semblez rien écrire sur "omegadiffout", bien que vous écrivez 100 copies de 'diffomega' à" diffomega ". On dirait que vous devriez pouvoir répéter votre code en enveloppant simplement la partie concernée dans une boucle 'For [...]' - cela ne fonctionne-t-il pas? –

Répondre

6

La première chose que vous devez faire, @Paulo, est bien rangé votre Mathematica afin que vous, et nous, peut voir le bois pour les arbres. Par exemple, votre 8 déclaration:

Table[ 
    Table [rnddf[i], {i, 1, 29}], {j, 1, 100}]; 

fait une grande table, mais la table n'est pas affectée à une variable ou utilisée d'une autre manière. Il semble y avoir d'autres déclarations dont les résultats ne sont pas utilisés non plus.

Ensuite, vous devez abandonner vos boucles For et utiliser les Mathematica idiomes - ils sont plus clairs pour nous qui utilisent Mathematica régulièrement pour comprendre, plus facile pour vous d'écrire, et probablement plus efficace aussi. Vos déclarations

For[i = 1, i < 31, 
rnd[i] = Random[NormalDistribution[0, 0.1]]; i++] 

Table[rnd[i], {i, 1, 30}] 

For[i = 1, i < 30, 
rnddf[i] = rnd[i + 1] - rnd[i]; i++ 
] 

diffomega = Table [rnddf[i], {i, 1, 29}]; 

peuvent, si je comprends bien, être remplacé par:

diffomega = Differences[RandomReal[NormalDistribution[0,0.1],{30}]]; 

Rappelez-vous toujours que si vous écrivez des boucles dans Mathematica vous faites probablement une erreur. La prochaine modification que vous devriez faire est d'arrêter d'utiliser Put et PutAppend jusqu'à ce que vous puissiez construire, en mémoire, au moins un petit exemple de la sortie entière que vous voulez écrire. Ensuite, écrivez cela dans un fichier en une fois avec Save ou Export ou l'une des autres fonctions d'E/S de haut niveau.

Lorsque vous avez fait cela, éditez votre code et expliquez ce que vous essayez de faire et moi, et d'autres SOers, nous essaierons d'aider davantage. Malheureusement, en ce moment, votre code est si peu que j'ai du mal à le comprendre.

+0

Vous n'avez même pas besoin de 'Table' quand vous voulez dessiner beaucoup de réels à partir d'une distribution aléatoire; utilisez simplement le second argument de 'RandomReal'. – Pillsy