Поддерживаются ли чистые функции MATLAB Symbolic Toolbox?

#matlab

#matlab

Вопрос:

Реализованы ли чистые функции Mathematica каким-либо образом в MATLAB Symbolic Toolbox? Я хотел бы вычислить вложенные дифференциации.

Простой пример: я хотел бы получить производную по направлению 2D-функции в направлении наибольшего изменения.

 syms f x y w
w = [ diff(f,x); diff(f,y) ] / sqrt(diff(f,x)   diff(f,y));
d = w * [ diff(f,x), diff(f,y) ];
  

Я хотел бы получить ответ:

 d = sqrt(diff(f,x)^2   diff(f,y)^2);
  

Это не работает, потому что MATLAB вычисляет diff (f, x)= diff (f, y) = 0 (он не знает, является ли это функцией). Способен ли MATLAB symbolic toolbox на что-то вроде того, чего я хотел бы достичь?

Комментарии:

1. Вы знаете, что f такое? Или вы хотите это в терминах общего f ?

2. Нет. Это произвольная дифференцируемая функция x и y.

3. Я забыл перезвонить вам после моего комментария… Пожалуйста, смотрите мой ответ ниже. Я не думаю, что то, что вы пытаетесь сделать, возможно в MATLAB, но я был бы рад узнать, если это иначе.

Ответ №1:

Из вашего вопроса:

Это не работает, потому что MATLAB вычисляет diff (f, x)= diff (f, y) = 0 (он не знает, является ли это функцией).

Это не ненормальное поведение, скорее ожидаемое. Когда вы инициализируетесь f как символьная переменная, с которой не связано определение f , и, следовательно, производная от w.r.t x должна возвращать 0 , а сама производная от w.r.t должна возвращать 1 . Mathematica ведет себя точно так же:

MATLAB:

 syms f x
diff(f,x)
 
ans =
 
0

diff(f,f)
 
ans =
 
1
  

Mathematica

 In[1]:= D[f, x]
        D[f, f]

Out[1]= 0
Out[2]= 1
  

В случае с чистыми функциями определение не зависит от фактической функции, и если вы вводите какой-либо аргумент, он должен его оценить. Например, определение чистой функции производной w.r.t. x в mathematica, D[#, x] amp;

 In[3]:= D[#, x] amp;[a x^2   b x   c]
Out[3]= 2 a x

In[4]:= D[#, x] amp;[a x^3   b f]
Out[4]= 3 a x^2
  

Ближайший эквивалент этого в MATLAB называется анонимной функцией. Определение для приведенной выше функции является

 syms f x a b c
y=@(f)diff(f,x);

y(a*x^2 b*x c)

ans =
 
b   2*a*x
  

Теперь, переходя к тому, что вы хотели сделать, в Mathematica можно сохранить определенные выражения без оценки и помассировать их, чтобы получить желаемую конечную форму вывода. Однако я не знаю о такой возможности в MATLAB, использующей символьный набор инструментов.