Необычное решение [] задержка поведения - PullRequest
3 голосов
/ 10 мая 2011

Для проекта, который предполагал вычисление длин связей по спектроскопическим данным, я использовал Solve[], чтобы решить довольно простое уравнение для неизвестного. Я начал замечать "необычное" поведение, когда я изменил ввод. В частности, когда я изменил число и Solve'd, результатом является ответ ранее. Однако повторное выполнение кода дает правильный ответ; как будто есть задержка одного исполнения. Вот пример:

B = (11.09 + del)*2.998*10^10;

c = h*1000*n*10^20/(8 \[Pi]^2);

h = 6.62618*10^-34;

n = 6.02204*10^23;

del = 0;

Solve[c/B == 0.97959253 R^2, R]

Выполнение дает

{{R -> -1.24567}, {R -> 1.24567}}

Однако, когда я изменяю del = 0 на del = 10 в вышеприведенном блоке, я получаю тот же ответ при выполнении! Когда я выполняю блок во второй раз, я получаю правильный ответ:

{{R -> -0.903299}, {R -> 0.903299}}

Затем, изменив del = 10 обратно на del = 0 и выполнив, вы получите:

{{R -> -0.903299}, {R -> 0.903299}}

и, как вы можете себе представить, выполнение блока во второй раз дает правильный ответ

{{R -> -1.24567}, {R -> 1.24567}}

Нет ничего особенного в 0 и 10, любые 2 числа работают. Это похоже на Solve[] блок с эффектом задержки ...

Я не уверен, является ли это причудой моего компьютера (MacBook Intel) или это что-то присущее Solve. Скажите, если вы, ребята, ведете себя так же, как я, когда запускаете этот код, и если да, у вас есть идея, почему это происходит? (Я попытался перезапустить Mathematica и запустить его снова, и он всегда ведет себя так).

Ответы [ 2 ]

7 голосов
/ 10 мая 2011

Проблема в том, что ваше определение del идет после некоторых других, где присутствует del.Следовательно, во время их выполнения del все еще имеет старое значение.У вас есть 2 варианта: либо разместить del назначение сверху:

del = 0;
B = (11.09 + del)*2.998*10^10;
c = h*1000*n*10^20/(8 Pi^2);
h = 6.62618*10^-34;
n = 6.02204*10^23;
Solve[c/B == 0.97959253 R^2, R]

, либо использовать SetDelayed (:=) для назначения:

B := (11.09 + del)*2.998*10^10;
c := h*1000*n*10^20/(8 Pi^2);
h = 6.62618*10^-34;
n = 6.02204*10^23;
del = 0;
Solve[c/B == 0.97959253 R^2, R]
1 голос
/ 19 мая 2011

Я думаю, что самое простое решение проблемы PJR - просто добавить

Clear["Global`*"]  

перед кодом.Тогда изменения del не будут иметь возможности переопределить B.^ _ ^

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