Я совершенно сбит с толку этим.
Я заметил, что когда достигается процесс глубоко внутри одного из моих модулей, где исходный вызов был сгенерирован из командной строки, он работает правильно, чем когда тот же процесс достигается, когда поток вызовов исходит из другого процесса, который вызывается из команды линия.
Я обнаружил, что все сводится к этой одной строке. В отладчике вижу это
if hastype(z,radical) then
...
Это дает false во втором случае и дает true при вызове в первом случае. Это должно дать true в обоих случаях.
В отладчике смотрю на z, говорит что имеет такое значение
1/x*sqrt(x^2*u)
Теперь в команде отладчика, когда я набираю
hastype(z,radical)
Это дает false
. Но когда я ввожу фактическое значение u
в команду:
hastype(1/x*sqrt(x^2*u),radical)
Теперь он дает true
!
Все локально для этого процесса:
dsolve_step:-dsolve_step_homog:-convert_to_homog := proc(f0, x, y, u)
local f, z, tmp;
1 f := f0;
2 f := subs(y = u*x,expand(f));
3 for z in op(f) do
4 ! if hastype(z,radical) then ##<=======
5 tmp := sqrt(collect(z^2,x));
6 f := subs(z = tmp,f)
end if
end do;
7 return simplify(f)
end proc
Поэтому я понятия не имею, почему hastype(z,radical)
дает false, а hastype(1/x*sqrt(x^2*u),radical)
дает true, когда z
само по себе равно 1/x*sqrt(x^2*u)
.
И это происходит только тогда, когда я вызываю модуль, как в случае 2, описанном выше.
Как видите, все локально. z,f,tmp
являются местными. Один и тот же вызов вышеуказанной функции выполняется в обоих случаях. Все входные данные одинаковы в обоих случаях.
Вот скриншоты фактической отладки:
Теперь я проверяю
Теперь я проверяю по типу показанное фактическое значение z
Это похоже на проблему с областью видимости, которую я не могу понять, что это такое. Может быть, то, на что я смотрю, не то, чем кажется.
Опять же, тот же вызов работает нормально, когда я вызываю модуль из командной строки с другого рабочего листа.
Оба рабочих листа (случай 1 и случай 2) используют разные математические движки. (Я настроил Maple для запуска нового математического движка для каждого рабочего листа, чтобы быть в безопасности)
Я ищу любое предложение, почему это происходит. Вызывающий процесс во втором случае также не использует никаких глобальных переменных. Я всегда начинаю с чистого ядра (перезагружаю).
Любая подсказка, что происходит и что искать? Или что попробовать найти в чем проблема?
Клен 2018.1, виндовс 10.
Обновить
Я нашел проблему. Но я действительно думаю, что это ошибка в Maple.
Я обнаружил, что если я использую eval(z)
, то это работает во втором случае, например:
if hastype(eval(z),radical) then
Теперь я получаю правду:
Я не понимаю, зачем мне нужно добавлять туда eval()
, поскольку Maple должен автоматически оценивать z
до его значения при использовании for z in op(f) do
, а затем ссылаться на z
внутри цикла.
Итак, мой вопрос изменился на: Зачем здесь нужно eval()
?
В любом случае, у меня есть обходной путь для этого. Но это не имеет смысла для меня сейчас.
convert_to_homog:=proc(f0,x,y,u)
local f,z,tmp;
f:=f0;
f:=subs(y=u*x,expand(f));
#this below can give wrong answer sometimes. It tries to
#change 1/X*sqrt(x^2) to sqrt(1)
#by moving x under the sqrt. But this is valid only when x>0
# i..e 1/x => sqrt(1/x^2) only when x>0
#keep it for now, until I implement exact solver.
for z in op(f) do
if hastype(eval(z), radical) then
tmp:=sqrt(collect(z^2,x));
f:=subs(z=tmp,f);
fi;
od;
return(simplify(f));
end proc;