Массив замены символьных векторов - в MATLAB отсутствует возможность точной замены - PullRequest
2 голосов
/ 25 июня 2019

У меня есть уравнение символических векторов (на самом деле, обычно это много уравнений), которое я хотел бы заменить другим символическим вектором.Я хотел бы, чтобы MATLAB заменил уравнение новыми символическими переменными так, чтобы ни одна из старых не осталась.Я использовал функцию subs, но, похоже, при первой же возможности использовать замену вместо точной замены

Вот пример того, что я имею в виду:

>> M = sym('m',[1,4]).'

M =

 m1
 m2
 m3
 m4

>> N = sym('n',[1,4]).'

N =

 n1
 n2
 n3
 n4

>> eqn = N(2,1) + 2*N(3,1) - 4*N(4,1)

eqn =

n2 + 2*n3 - 4*n4

>> relation = [N(1,1);N(4,1); N(3,1) - 2*N(4,1); N(2,1)]


relation =

        n1
        n4
 n3 - 2*n4
        n2

>> subs(eqn,relation,M)

ans =

m4 - 4*m2 + 2*n3

От руки я ясно вижу, что eqn == m4 + 2*m3 точно.Тем не менее, когда я прошу MATLAB заменить, у меня все равно остается +2*n3 в уравнении.

Я искал похожие проблемы без особой пользы, как я могу заставить MatLab заменить ВСЕ вхождения n в моем уравнении?

У меня обычно будет много таких уравнений, и я знаю, что можно точно заменить на m's.

1 Ответ

2 голосов
/ 25 июня 2019

Вы можете использовать обратное отношение, вместо использования M, выраженного N, вы можете получить обратное соотношение - N, выраженное M.Это проще для subs, потому что вы хотите заменить N:

M = sym('m',[1,4]).';
N = sym('n',[1,4]).';
eqn = N(2,1) + 2*N(3,1) - 4*N(4,1);
relation = [N(1,1);N(4,1); N(3,1) - 2*N(4,1); N(2,1)];

% Get invers of relation, N => M
invRelation = struct2array(solve(M - relation, N)).';
newEqn = subs(eqn,N,invRelation);

Результат:

relation =

        n1
        n4
 n3 - 2*n4
        n2


invRelation =

        m1
        m4
 2*m2 + m3
        m2


eqn =

n2 + 2*n3 - 4*n4


newEqn =

2*m3 + m4

Другим простым примером были сбои сабов

I 'Я не уверен, документированы ли ограничения subs, я не нашел ни одного, но вот еще один очень простой пример, где subs терпит неудачу:

syms x y
eun = x;
subs1 = subs(x,x,-y)
subs2 = subs(x,-x,y)

Вывод:

subs1 =

-y


subs2 =

x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...