Почему Matlab предоставляет произвольную константу интегрирования?

Я интегрирую следующее выражение:

грех(2*х)/4 - 8*греш(х)

В Matlab я вставил

syms x
int(sin(2*x)/4 - 8*sin(x)) 

и он возвращается

17*cos(x/2)^2 - cos(x/2)^4

В Вольфрам, я ввожу

int(sin(2*x)/4 - 8*sin(x))

и он возвращается

8 cos(x) - 1/8 cos(2 x) + constant

Для сравнения двух решений я поместил следующее в Wolfram

int(sin(2*x)/4 - 8*sin(x)) == 17*cos(x/2)^2 - cos(x/2)^4

и это показывает, что решение Matlab дает константу интегрирования 65/8, тогда как Wolfram оставляет константу интегрирования произвольной. Я рад, что уловил это, потому что это имеет большое значение в моем окончательном решении, хотя и постоянно. Мой вопрос в том, почему Matlab считает необходимым предоставлять константу интегрирования, когда, в конце концов, это произвольно? Кажется довольно опасным.


person ThatsRightJack    schedule 03.03.2017    source источник
comment
fwiw mathematica дает 8 Cos[x] - 1/8 Cos[2 x] (без явной константы, поскольку, как и в случае с Matlab, если вы должны прочитать документы и понять, что это дает вам первообразную производную, а первообразные не уникальны в пределах произвольных констант).   -  person agentp    schedule 04.03.2017


Ответы (1)


Согласно int документации, "результаты, возвращаемые int, не включают константы интегрирования. ". Но ясно, что некоторые были введены во время решения. Поэтому я думаю, что лучшим утверждением было бы: MATLAB не вводит никаких новых символических констант в решение, если оно найдено (в отличие от WolframAlpha, но как Mathematica).

Однако, по-видимому, определенные произвольные константы, вносимые в решение и, возможно, скрытые в нем, могут быть введены алгоритмом решения. Это совершенно верно, поскольку неопределенный интеграл дает бесконечное число правильных решений без начальных или конечных данных.

Согласно документации MuPAD для int (символьный движок MATLAB), неопределенный интегралы решаются с помощью «поиска в таблице или интеграции Риша», и я уверен, что это после некоторого синтаксического анализа и упрощения перед загрузкой. Таким образом, какая бы ветвь дерева решений ни опускалась, символическая машина в конечном итоге производила степени тригонометрических функций, которые указывают на введение констант при их сокращении. Не знаю, стандартная ли это практика. Но я вижу, как предоставление алгоритму некоторой свободы действий для введения таких констант может быть полезным для надежного метода решения, поскольку символическое неопределенное интегрирование является чрезвычайно сложной задачей.

Итак, чтобы попытаться ответить на вопрос: «Почему Matlab считает необходимым предоставлять константу интегрирования, когда, в конце концов, это произвольно?» Он делает это, потому что может, и лежащий в основе алгоритм по какой-то причине определил, что это правильный курс действий. Кроме того, решение совершенно верно, поскольку оно произвольно.

«Кажется довольно опасным». Я бы не согласился. Хотя это и не совсем идеально, результаты интеграции будут правильными после того, как соответствующие данные будут введены и использованы в тандеме с решением. Если таких подходящих данных не существует, проблема недоопределена, и любое решение допустимо для произвольной константы.

person TroyHaskin    schedule 03.03.2017
comment
Похоже, ты знаешь свое дело. Вроде отключить никак нельзя? - person ThatsRightJack; 03.03.2017
comment
Как я могу заставить Matlab выводить 8 * cos (x) - 1/8 * cos (2 * x) + 65/8, а не 17 * cos (x/2) ^ 2 - cos (x/2) ^ 4 ? Я хочу увидеть константу интеграции, которую он добавляет. - person ThatsRightJack; 07.03.2017
comment
@ThatsRightJack Извините за задержку; забыл об этом на выходных. Учитывая кажущуюся сложность символической неопределенной интеграции и отсутствие опций в документации, я сомневаюсь, что это что-то, что можно отключить. Что есть, то есть. Что касается упрощения, то может потребоваться немного помассировать после интеграции, но I=int(sin(2*x)/4 - 8*sin(x)); и rewrite(expand(simplify(rewrite(I,'exp'))),'cos') дают желаемый результат. - person TroyHaskin; 07.03.2017
comment
Не беспокойся. Спасибо за ответ. Я боялся, что до этого дойдет. Я попробовал несколько вызовов rewrite и expand, но безуспешно. Я предполагаю, что комбинация, которую вы составили, зависит от проблемы. Как вы сказали, так оно и есть. Если мне действительно нужно знать константу, я уточню у Вольфрама. Спасибо за помощь. - person ThatsRightJack; 07.03.2017
comment
@ThatsRightJack Извините за поздний ответ, я только сейчас это увидел. Почему вы сказали, что 17*cos(x/2)^2 - cos(x/2)^4 вводит константу, а 8*cos(x) - 1/8*cos(2*x) - нет? На мой взгляд, любое решение обязательно имеет произвольную константу, а документация MATLAB только говорит, что в результате нет произвольной «+ константы». Теперь, если вы хотите «исправить» константу, вы можете использовать определенное интегрирование и сказать f(x) = int(sin(2*x)/4 - 8*sin(x),x,0,x), которое возвращает непрерывное f, такое что f(0)==0. (Это f оказывается -((cos(x) - 1)*(cos(x) - 31))/4.) - person Christopher Creutzig; 28.05.2018