Использование символического набора инструментов для упрощения выражений известных функций (например, тригонометрических функций) - PullRequest
0 голосов
/ 06 ноября 2018

Я хотел бы использовать matlab для упрощения выражений, например, тригонометрические функции для меня. Например я попробовал это:

syms x;
simplify(sin(x)/cos(x))

Мой ожидаемый результат был бы

загар (х)

но вместо этого я только что получил

sin (х) / соз (х)

еще раз. Поэтому я провел небольшое исследование и обнаружил rewrite, какой KIND OF делает то, что я хочу. Я могу использовать

syms(x);
simplify(rewrite(sin(x)/cos(x),`tan`))

и я получу

* * 1 022 тангенс (х) * +1023 *

что я и хотел в этом случае. Дело в том, что я не всегда буду знать, какую целевую функцию я хочу достичь. На wolframalpha.com таких вещей легко достичь. Вы просто поместите свое выражение там, и это даст вам лучшее упрощение этого. Есть ли способ достичь этого и в Matlab?

1 Ответ

0 голосов
/ 06 ноября 2018

MATLAB просто в безопасности.

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

Проблема здесь может быть показана, если вы попытаетесь упростить ваше равенство. Посмотрите на этот простой пример:

simplify(x==x) % Returns symbolic "TRUE"

На этой ноте я бы ожидал, что строка ниже также вернет TRUE.

simplify(tan(x) == sin(x) / cos(x))

Но вместо этого он возвращает ~x in Dom::ImageSet(pi*(k + 1/2), k, Z_)

Когда x находится в наборе, описанном выше {..., -pi/2, pi/2, 3pi/2, ...}, это означает cos(x) == 0, а sin(x)/cos(x) вызывает ошибку деления на ноль, тогда как tan(x) приближается к значению inf. Следовательно, при этих значениях tan(x) ~= sin(x)/cos(x).

Эксперимент

Из любопытства я запустил следующий скрипт:

clc, clear;

% Create the symbolic variable and remove all assumptions placed on it.
syms x; 
assume(x,'clear');

% Define the function, and test MATLAB's behavior
y = sin(x)/cos(x);
disp('Before assuming:');
disp(simplify(y));
disp(simplify(tan(x) == y));

% Place restriction on cos(x), and re-test MATLAB's behavior
assume(cos(x) ~= 0);
disp('After assuming:');
disp(simplify(y));
disp(simplify(tan(x) == y));

И вывод был:

Before assuming:
sin(x)/cos(x)
~x in Dom::ImageSet(pi*(k + 1/2), k, Z_)

After assuming:
sin(x)/cos(x)
TRUE

Как и ожидалось, это не упростило функцию в первый раз, потому что cos(x) может равняться нулю. Второй результат был неожиданным. После того, как сделано предположение, что cos(x) ~= 0, MATLAB правильно заявил, что tan(x) == sin(x)/cos(x) верно, но все еще не упростило выражение. Это может быть связано со сложностью процесса упрощения или с проблемой безопасности, поскольку в любой момент я мог очистить предположение, и равенство больше не будет иметь места.

...