借助mathematica加快符号描述

时间:2018-12-20 13:04:40

标签: performance wolfram-mathematica

我已经写下了以下代码。它是mathematica的代码,我想用符号做一些“简单的”线性代数。 该代码设置了一个矩阵(称为A)和一个向量(称为b)。然后,它解出k的等式A * k = b。 不幸的是,我的代码非常慢,例如对于n = 5,需要几个小时。 有解决这个问题的更好方法吗?我对mathematica不太熟悉,我的代码也不专业,所以您有加快速度的提示吗? 这是我的代码。

compress([],[]).  % Empty list
compress([H|T], X) :-
  member(H, T),    % If H is not the last occurrence...
  compress(T, X).  % remove duplicates from the tail, ignore H.
compress([H|T], X) :-
  not(member(H, T)),  % If H is the last occurrence...
  compress(T, XT),    % ...compress the tail...
  append([H], XT, X). % ...and prepend H to the result.

感谢任何提示!

P.S。该代码应该运行!

1 个答案:

答案 0 :(得分:0)

您有很多变量和分母,这两种变量通常会使事情变得很慢。

让我们尝试一种更简单,更快速的方法,该方法可以解决问题的一般形式,然后替换所有变量和分母。

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变大并且您的分母森林越来越大,这种情况将持续快速或可行。

在假设一切正常之前,请仔细测试。

P.S。感谢您实际运行的代码! (我什至没有使用clear [all])