Численное интегрирование символьного дифференцирования

Ниже приведена задача MATLAB.

Предположим, я определяю функцию f(x,y). Я хочу вычислить частную производную f по y, оцененную по определенному значению y, например, y=6. Наконец, я хочу интегрировать эту новую функцию (которая является функцией только от x) в диапазоне значений x.

Например, это то, что я пробовал

syms x y; f = @(x, y) x.*y.^2; Df = subs(diff(f,y),y,2); Int = integral(Df , 0 , 1),

но я получаю следующую ошибку.

Error using integral (line 82) First input argument must be a function handle.

Может ли кто-нибудь помочь мне в написании этого кода?


person Dave S    schedule 15.12.2014    source источник
comment
Как правило, когда программное обеспечение выдает ошибку, рекомендуется прочитать ее, потому что она сообщает вам, в чем причина ошибки и где она находится. Тебе стоит попробовать это. Кроме того, если вам нужна помощь от кого-то еще, сообщите им, какую ошибку вы получаете, также очень помогает!   -  person Ander Biguri    schedule 15.12.2014
comment
@Ander Biguri Вопрос обновлен!   -  person Dave S    schedule 15.12.2014
comment
Я получаю, что diff не является поддерживаемым классом для дескриптора функции. Это означает, что вы не можете использовать diff в f=@ ... Может быть, версия Matlab отличается? мой 2013b   -  person Ander Biguri    schedule 15.12.2014
comment
хм, странно. Это может быть связано с тем, что MATLAB обращается к старой функции 'diff', nf.nci.org.au/facilities/software/Matlab/techdoc/ref/diff.html   -  person Dave S    schedule 15.12.2014
comment
Что ты подразумеваешь под старым? uk.mathworks.com/help/matlab/ref/diff.html это документы 2014b.   -  person Ander Biguri    schedule 15.12.2014
comment
Плохо, я полагаю, вы делаете syms x y перед кодом пирога f. Я предлагаю вам попытаться опубликовать все, что актуально в следующий раз;)   -  person Ander Biguri    schedule 15.12.2014
comment
Ах, да, они были предопределены в моем рабочем пространстве. Извиняюсь. Теперь вопрос отредактирован.   -  person Dave S    schedule 15.12.2014
comment
Вы смешиваете числовую квадратуру (integral) с символическим дифференцированием (sym/diff). Выберите либо числовое, либо символическое значение, либо будьте очень осторожны при выборе между ними. Используйте int (sym/int) для символической интеграции.   -  person horchler    schedule 16.12.2014


Ответы (2)


Для решения задачи требовалось matlabFunction. Решение выглядит так:

syms x y
f = @(x, y) x.*y.^2;
Df = matlabFunction(subs(diff(f,y),y,2));
Int = integral(Df , 0 , 1);
person Dave S    schedule 15.12.2014
comment
Это ответ или вы пытаетесь уточнить свой вопрос? - person rayryeng; 15.12.2014
comment
@rayryeng Это ответ. - person Dave S; 15.12.2014
comment
Более аккуратный метод, вероятно, состоял бы в том, чтобы избежать вызова subs в matlabFunction и просто сделать Df функцией x и y, а затем настроить интеграл как integral(@(x) Df(x,2),0,1). Но matlabFunction — это именно та функция, которую можно здесь использовать. - person David; 16.12.2014

Сохраняя все это символическим, используя sym/int:

syms x y;
f = @(x, y) x.*y.^2;
Df = diff(f,y);
s = int(Df,x,0,1)

который возвращает y. Вы можете заменить 2 на y здесь или ранее, как вы сделали в своем вопросе. Не то чтобы это дало вам точный ответ в этом случае без ошибки с плавающей запятой, в отличие от integral, который вычислял интеграл численно.

При поиске функций в Matlab обязательно обратите внимание, в каком наборе инструментов они находятся и какие классы (типы данных) они поддерживают для своих аргументов. В некоторых случаях существуют перегруженные версии с тем же именем, но в других случаях вам может потребоваться поискать другой метод (или разработать свой собственный).

person horchler    schedule 15.12.2014