Выражение (или процедура), которое должно быть построено, должно оцениваться как числовое значение с плавающей запятой. Итак, для вашего выражения 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);