Клен: Как придать значения предположениям для построения? - PullRequest
1 голос
/ 11 сентября 2011

Итак, у меня есть простой пример того, что я хочу сделать:

restart;
assume(can, real);
f := {g = x+can*x*y, t = x+x*y};
assign(f[1]); g;
can := 2;
plot3d(g, x = 0 .. 100, y = 0 .. 100);

enter image description here

, пока это работает:

restart;
f := {g = x+can*x*y, t = x+x*y};
assign(f[1]);
can := 2;
plot3d(g, x = 0 .. 100, y = 0 .. 100);

enter image description here

Но эти предположения действительно важны для моего случая из реальной жизни (для некоторых оптимизаций с комплексными числами), поэтому я не могу просто предположить, что не могу предположить.

Почему это не для меня, и как сделатьэто сюжет?

1 Ответ

1 голос
/ 12 сентября 2011

Выражение (или процедура), которое должно быть построено, должно оцениваться как числовое значение с плавающей запятой. Итак, для вашего выражения g имя can должно иметь конкретное числовое значение во время создания любого графика g.

Но вы можете создать последовательность трехмерных графиков для различных значений can и отобразить их. Вы можете отобразить их все сразу, с наложением. Или вы можете отобразить их в анимационной последовательности. И вы можете покрасить или затенить их по-разному, чтобы дать визуальную подсказку, что can меняется и отличается для каждого.

restart;

f := {g = x+can*x*y, t = x+x*y};

eval(g,f);

N:=50:
Pseq := seq(
  plot3d(eval(g,f),
         x=0..10,y=0..10,
         color=RGB(0.5,0.5,can/(2*N)),
         transparency=0.5*(can/(N+1))),
            can=1 .. N):

plots:-display(Pseq, axes=box);

plots:-display([Pseq],insequence=true,axes=box);

Кстати, вам не нужно присваивать g только ради использования уравнения для g, которое появляется внутри f. Выполнение этого задания (скажем, с использованием assign, скажем, как вы) делает более неловким для вас впоследствии создание других уравнений в терминах чистого имени g, если вы сначала не unassign имя g. Некоторые люди считают, что для таких задач проще вообще не назначать g, а просто использовать eval, как я делал выше.

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

restart;
assume(can, real);
f := {g = x+can*x*y, t = x+x*y};

            {g = x + can~ x y, t = x + x y}

assign(f[1]);
g;

                      x + can~ x y

can := 2:

g;

                      x + can~ x y

# This fails, because g contains the local name can~
plot3d(g, x=0..100, y=0..100);

# A procedure to make the desired substitution
revert:=proc(nm::name)
local len, snm;
  snm:=convert(nm,string);
  len:=length(snm);
  if snm[-1]="~" then
    return parse(snm[1..-2]);
  else return parse(nm);
  end if;
end proc:

# This is the version of the expression, but with global name can
subsindets(g,`local`,revert);

                      x + can x y

# This should work
plot3d(subsindets(g,`local`,revert),
       x=0..100,y=0..100);
...