1

所以我有一个简单的例子来说明我想做的事情:

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);

在此处输入图像描述

虽然这有效:

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

在此处输入图像描述

但是这些假设对于我的现实生活案例(对于复数的一些优化)非常重要,所以我不能只是假设不能。

为什么它对我没有任何作用以及如何使它绘图?

4

1 回答 1

1

要绘制的表达式(或过程)必须计算为数值浮点数。因此,对于您的表达式g,在生成任何图时,名称can必须具有特定的数值g

但是您可以为 的各种值生成一系列 3D 图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使用 name gg有些人发现根本不为此类任务分配任务更容易,而是eval像我上面所做的那样简单地使用。

现在谈谈你更深层次的问题。您创建一个包含本地假定名称的表达式。然后稍后您想使用相同的表达式,但使用该名称的全局、未假定版本。您可以创建表达式,其中包含全局的、未假定的名称而不是本地的假定名称,购买执行替换。

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);
于 2011-09-12T00:54:03.620 回答