Arhn - архитектура программирования

Plot2d вырезать в 3D-функции

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

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. Поэтому он отказывается делать производную по константе (?).

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

29.05.2020

  • Тело функции не оценивается, когда функция определена как :=, поэтому производные не вычисляются до тех пор, пока функция не будет вызвана, когда x, y и z имеют числовые значения. Один из способов решить эту проблему — определить функцию следующим образом: define(dx2_f2(x,y,z), diff(f2(x,y,z),x,2)), потому что define оценивает тело функции во время определения функции. Попробуйте fundef(dx2_f2), чтобы увидеть, что, по мнению Maxima, представляет собой тело функции. 29.05.2020
  • Спасибо. А как насчет операторов ev и ''? Может ли это помочь, если функция уже определена как :=? Я бы предпочел использовать :=, так как это больше похоже на математику и более удобочитаемо для человека. maxima.sourceforge.net/docs/manual/maxima_8.html 30.05.2020

Ответы:


1

Вот решение, в котором используется цитата-цитата, как вы предложили. Основная идея состоит в том, чтобы сказать 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, как я предлагал вначале.

30.05.2020
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..