Plot2d вырезать в 3D-функции - PullRequest
4 голосов
/ 29 мая 2020

У меня есть трехмерные гауссианы и их производные (оператор Лапласа)

f1(x,y,z):=exp(-w1*((x-x1)^2+y^2+z^2));
f2(x,y,z):=exp(-w2*(x^2+y^2+z^2));
dx2_f2(x,y,z):=diff(f2(x,y,z),x,2);
Lf2(x,y,z):=diff(f2(x,y,z),x,2) + diff(f2(x,y,z),y,2) + diff(f2(x,y,z),z,2);

Теперь я хочу построить профиль вдоль x, вырезая функцию для фиксированного y,z для некоторых значений параметров

w1:1.2;w2:0.5;x1:1.5;
plot2d( Lf2(x,0,0) ,[x,-5,5]);

Я получаю следующую ошибку

diff: second argument must be a variable; found 0
#0: Lf2(x=x,y=0,z=0)
 -- an error. To debug this try: debugmode(true);

Хотя plot2d( [f1(x,0,0),f2(x,0,0),dx2_f2(x,0,0)] ,[x,-5,5]); работает нормально.

Та же ошибка возникает, если я пытаюсь частично подставить переменные вручную Lf2x(x):=Lf2(x,0,0);

Думаю, проблема в том, что Maxima / lisp выполняет некоторую ленивую оценку , поэтому производные по y,z еще не вычисляются, когда я заменяю их на y=0,z=0 . Поэтому он отказывается делать производную по константе (?).

Но я не знаю, как это решить (т.е. подставить константу только после вычисления производных)

1 Ответ

1 голос
/ 30 мая 2020

Вот решение, которое использует цитату-цитату, как вы предложили. Основная идея состоит в том, чтобы сказать foo(x) := ''(diff(something, x)) вместо foo(x) := diff(something, x).

(%i2) f1(x, y, z) := exp(-w1*((x - x1)^2 + y^2 + z^2));
                                           2    2    2
(%o2)   f1(x, y, z) := exp((- w1) ((x - x1)  + y  + z ))
(%i3) f2(x, y, z) := exp(-w2*(x^2 + y^2 + z^2));
                                        2    2    2
(%o3)       f2(x, y, z) := exp((- w2) (x  + y  + z ))
(%i4) dx2_f2(x, y, z) := ''(diff(f2(x, y, z), x, 2));
                                           2    2    2
                             2  2   - w2 (z  + y  + x )
(%o4) dx2_f2(x, y, z) := 4 w2  x  %e
                                                     2    2    2
                                              - w2 (z  + y  + x )
                                     - 2 w2 %e
(%i5) Lf2(x, y, z) := ''(diff(f2(x, y, z), x, 2) + diff(f2(x, y, z), y, 2) + diff(f2(x, y, z), z, 2));
                                        2    2    2
                          2  2   - w2 (z  + y  + x )
(%o5) Lf2(x, y, z) := 4 w2  z  %e
                     2    2    2
       2  2   - w2 (z  + y  + x )
 + 4 w2  y  %e
                     2    2    2                  2    2    2
       2  2   - w2 (z  + y  + x )          - w2 (z  + y  + x )
 + 4 w2  x  %e                    - 6 w2 %e
(%i6) w1: 1.2;
(%o6)                          1.2
(%i7) w2: 0.5;
(%o7)                          0.5
(%i8) x1: 1.5;
(%o8)                          1.5
(%i9) plot2d( Lf2(x, 0, 0) ,[x, -5, 5]);
(%i10) plot2d( [f1(x, 0, 0), f2(x, 0, 0), dx2_f2(x, 0, 0)], [x, -5, 5]);

С этими определениями, я считаю, что графики в конце делают красивые графики без ошибок. Обратите внимание, что определения функций% o4 и% o5 имеют фактические производные в правой части, а не выражение diff. Вы можете получить тот же эффект, используя define, как я предлагал вначале.

...