我有一个包含100001个变量(x1到x100000和alpha)的方程组,并且正好有很多方程式。在Matlab或其他方面,是否存在计算上有效的方法来解决这个方程组。我知道solve()命令,但我想知道是否有更快的运行。方程的形式如下:
1.) -x1 + alpha * (x4 + x872 + x9932) = 0
.
.
.
100000.) -x100000 + alpha * (x38772 + x95) = 0
换句话说,第i个方程有变量xi,其中系数-1加到alpha *(其他一些变量的总和)等于0.最后的等式只是x1 + ... + x100000 = 1。 / p>
答案 0 :(得分:3)
数学部分
该系统可以始终被赋予特征[值/向量]方程规范形式:
** A *** x * =λ x
其中 A 是系统的矩阵, x = [ x1 ; X2 ; ...; x100000 ]。以这个question为例,系统可以写成:
/ \ / \ / \
| 0 1 0 0 0 | | x1 | | x1 |
| 0 0 1 0 1 | | x2 | | x2 |
| 1 0 0 0 0 | x | x3 | = (1/alpha) | x3 |
| 0 0 1 0 0 | | x4 | | x4 |
| 0 1 0 1 0 | | x5 | | x5 |
\ / \ / \ /
这意味着你的特征值λ= 1 /α。当然,你应该注意复杂的特征值(除非你真的想把它们考虑在内)。
Matlab部分
这对你的品味和技巧很重要。您始终可以使用eig()
找到矩阵的特征值。最好使用稀疏矩阵(记忆经济):
N = 100000;
A = sparse(N,N);
% Here's your code to set A's values
A_lambda = eig(A);
ieps= 0e-6; % below this threshold imaginary part is considered null
alpha = real(1 ./ (A_lambda(arrayfun(@(x) imag(x)<ieps, A_lambda)))); % Chose Real. Choose Life. Choose a job. Choose a career. Choose a family. Choose a f****** big television, choose washing machines, cars, compact disc players and electrical tin openers. Choose good health, low cholesterol, and dental insurance. Choose fixed interest mortgage repayments. Choose a starter home. Choose your friends. Choose leisurewear and matching luggage. Choose a three-piece suit on hire purchase in a range of f****** fabrics. Choose DIY and wondering who the f*** you are on a Sunday morning. Choose sitting on that couch watching mind-numbing, spirit-crushing game shows, stuffing f****** junk food into your mouth. Choose rotting away at the end of it all, pissing your last in a miserable home, nothing more than an embarrassment to the selfish, f***** up brats you spawned to replace yourself. Chose life.
% Now do your stuff with alpha here
但是,请注意这一点:数值求解大特征值方程可能会给出复数值,其中实际值是预期的。如果您在开头没有找到任何内容,请将ieps
调整为明智的值。
要找到特征向量,只需从系统中取出一个,然后通过Cramer的规则求解其余部分。如果你愿意,可以将它们归为一个。