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方程式を使うためだけにを割り当てる必要はありません。その割り当てを行うと(たとえば、あなたが行ったように)、最初に名前を付けない限り、純粋な名前に関して他の方程式を作成するのがさらに厄介になります。一部の人々は、そのようなタスクにはまったく割り当てを行わず、上記のように単純に使用する方が簡単だと感じています。gfassigngunassignggeval

次に、より深い問題に移ります。ローカルの想定名を含む式を作成します。その後、同じ式を使用しますが、その名前のグローバルで想定外のバージョンを使用します。式を作成し、ローカルの想定名の代わりにグローバルの想定外の名前を含めて、置換を実行することを購入できます。

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 に答える