Проверка символьных вычислений

Мне приходится делать некоторые вычисления, где возникают длинные формулы, в основном включающие производные полиномов с переменными коэффициентами.

К сожалению, результаты, которые я получаю от таких движков, как Mathematica или Maple, представлены способом, который сильно отличается от тех, которые мне нужны, и преобразование результата в желаемую форму занимает слишком много времени (не говоря уже о риске повторного внесения ошибок).

Поэтому мне было интересно, есть ли какой-нибудь способ вместо этого выполнить вычисления самостоятельно, а затем позволить проверить результат - то есть своего рода «проверка уравнений»:

Я ввожу d/dx f(x) = g(x), где я предоставляю ОБЕ стороны, и система оценивает это как истинное или ложное.


person harlekin    schedule 12.11.2013    source источник


Ответы (4)


Я бы проверил sym/isequaln. Это перегруженная версия isequaln, используемая для сравнения символьных выражений. Например:

syms x
f(x) = 3*x^3-2*ln(x);
g(x) = 9*x^2 - 2/x;
isequaln(f,g)

ans =
    0

isequaln(diff(f), g)

ans = 
    1

См. документацию MathWorks по этой функции. Это очень удобно.

person zachd1_618    schedule 12.11.2013
comment
К вашему сведению, я считаю, что символическая версия — R2013a+. . Числовая версия — R2012a+, но она просто заменила ужасное имя isequalwithequalnans. - person horchler; 13.11.2013

В Maple используйте is(f=g). Если результат равен FAIL, установите _EnvTry:= hard; и повторите попытку команды is.

person Carl Love    schedule 13.11.2013

В немного более старых версиях Matlab (обратно к R2012a) , можно использовать isAlways для проверки символьных уравнений. Эта функция также полезна для проверки неравенств. Только не забывайте, что буква «А» в имени функции пишется с большой буквы. Взяв на себя смелость использовать пример @zachd1_618:

syms x;
f = 3*x^3-2*log(x);
g = 9*x^2 - 2/x;
isAlways(f == g)

возвращает 0, но

isAlways(diff(f,x) == g)

возвращает 1.

При использовании isequaln или isAlways рекомендуется использовать преимущества предположения. Также интересно sym/logical:

syms x;
isAlways(1 == sin(x)^2+cos(x)^2)

возвращает 1, но

logical(1 == sin(x)^2+cos(x)^2)

возвращает 0, так как это не упрощает выражения перед сравнением.

person horchler    schedule 13.11.2013

f = 3 x^3 - 2 Log[x];
g = 9 x^2 - 2/x;
PossibleZeroQ[f - g]
PossibleZeroQ[D[f, x] - g]
D[f, x] == g

ЛОЖЬ

Истинный

Истинный

person chyanog    schedule 13.11.2013
comment
обычно вам нужно будет использовать Simplify в прямом тесте на равенство - person agentp; 13.11.2013
comment
Я бы посоветовал Джорджу использовать только PossibleZeroQ в качестве быстрой первой проверки. Simplify и FullSimplify - это то, что вам действительно следует использовать. Вы обнаружите, что они часто не могут подтвердить, казалось бы, правильные отношения из-за неявных предположений, которые вы делаете, подобно тому, что Хорчер написал в своем ответе, используя символический набор инструментов Matlab. Вы можете использовать опцию Assumptions, чтобы сообщить системе Mathematica о таких ограничениях. - person Albert Retey; 13.11.2013