автоматизировать математическую процедуру: мне нужны промышленные результаты и я получаю - PullRequest
0 голосов
/ 27 июня 2010

У меня есть следующий простой код в mathematica, который я хочу для одного вывода. Но я хочу получить сотни или тысячи. Как я могу это сделать?

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"]

Это помещает в файл "phiout" и "omegadiffout" только последнее значение. Мне нужны сотни из них. Для каждого случайного поколения мне нужен выход.

Заранее спасибо

1 Ответ

6 голосов
/ 28 июня 2010

Первое, что вам нужно сделать, @Paulo, привести в порядок вашу Mathematica , чтобы вы и мы могли видеть лес для деревьев.Например, ваш 8-й оператор:

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

создает большую таблицу, но таблица не присваивается переменной или используется другим способом.Кажется, есть и другие утверждения, результаты которых тоже не используются.

Далее вы должны отказаться от своих циклов For и использовать идиомы Mathematica - они понятнее для тех, кто использует Mathematica регулярно для понимания, легче для вас писать и, вероятно, более эффективно.Ваши заявления

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}];

, если я правильно понимаю, могут быть заменены на:

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

Всегда помните, что если вы пишете циклы в Mathematica, вы, вероятно, ошибаетесь.Следующее изменение, которое вы должны сделать, это прекратить использовать Put и PutAppend, пока вы не сможете собрать в памяти хотя бы небольшой пример всего вывода, который вы хотите записать.Затем запишите это в файл за один раз с помощью Save или Export или одной из других высокоуровневых функций ввода / вывода.

Когда вы это сделаете, отредактируйте свой код и объясните, что вы такое.пытаясь сделать, и я, и другие SOers, постараюсь помочь дальше.К сожалению, сейчас ваш код настолько не Mathematica - что у меня возникли проблемы с его выяснением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...