Ускорьте символическое вычисление с помощью математики - PullRequest
0 голосов
/ 20 декабря 2018

Я написал следующий код.Это код для математики, и я хотел бы сделать некоторую «простую» линейную алгебру с символами.Код устанавливает матрицу (называемую A) и вектор (называемый b).Тогда он решает уравнение A * k = b для k.К сожалению, мой код очень медленный, например, для n = 5 это занимает несколько часов.Есть ли лучший способ решения этой проблемы?Я не очень знаком с mathematica, и мой код довольно непрофессиональный, так что у вас есть какие-то советы по ускорению?Вот мой код.

clear[all];


n = 3;

MM = Table[Symbol["M" <> ToString@i], {i, 1, n}];

RB = Table[
   Symbol["RA" <> FromCharacterCode[65 + i] <> ToString@(i + 1)], {i, 
    1, n - 1}];

mA = Table[Symbol["mA" <> FromCharacterCode[65 + i]], {i, 1, n - 1}];
mX = Table[
   Symbol["m" <> FromCharacterCode[65 + i] <> "A"], {i, 1, n - 1}];
R = Table[
   Symbol["R" <> FromCharacterCode[64 + i] <> ToString@(j + 1)], {i, 
    1, n}, {j, 1, n - 1}];




b = Table[-MM[[1]]*(1/(mA[[i]]*(R[[1, i]] - RB[[i]])) - 
      1/(mX[[i]]*(-R[[i + 1, i]] + RB[[i]]))), {i, 1, n - 1}];



A = Table[
   MM[[j + 1]]*(R[[1, j]]/(mA[[i]]*(R[[1, i]] - RB[[i]])) - 
      R[[i + 1, j]]/(mX[[i]]*(-R[[i + 1, i]] + RB[[i]]))), {i, 1, 
    n - 1}, {j, 1, n - 1}];


K = LinearSolve[A, b];
MatrixForm[K]

Спасибо за любые подсказки!

PS Код должен работать!

1 Ответ

0 голосов
/ 20 декабря 2018

У вас есть много переменных и много знаменателей, которые часто могут очень замедлить процесс.

Давайте попробуем более простой более быстрый метод, который решает общую форму вашей проблемы, а затем подставляет все ваши переменныеи знаменатели.

n = 5;
MM = ...
...
A = ...
m={{m1,m2,m3,m4},{m5,m6,m7,m8},{m9,m10,m11,m12},{m13,m14,m15,m16}};
sol=Inverse[m].b/.Thread[Rule[Flatten[m],Flatten[A]]]

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

Этот метод быстрее, чем Inverse[A].b, и намного быстрее, чем LinearSolve[A, b] для вашей проблемы, но этовремя используется только для расчета решения и не включает потенциально большое количество времени, затрачиваемого на его использование.Он также не включает в себя какие-либо программы, скрытые внутри LinearSolve для решения потенциальных проблем и особых случаев.

Но я не уверен, что ваш n увеличивается, а лес знаменателей растет намного больше, чем это будетпродолжайте работать быстро или выполнимо.

Протестируйте это внимательно, прежде чем предположить, что все работает.

PS Спасибо за код, который действительно работал!(Я даже не использовал «все»)

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