求解方程的线性系统

时间:2019-02-22 10:18:42

标签: python equation-solving finite-element-analysis

我正在使用有限元方法来计算通过元件的热流。 我目前坚持求解方程组,在方程组的两边都有变量。一个简单的例子可能是这样的

| 1  -1   0|   |100 |   |q1|   
|-1   2  -1| . | T2 | = |0 |   
| 0  -1   1|   | 0  |   |q3|

我正在考虑使用的方法是将矩阵减小到2x2,因为已知温度为“ T1”,并相应地更改右侧。并继续在“ T3”行中进行相同的操作。 但是我的顾问一直在建议我这样做。

您将如何解决这样的系统?

2 个答案:

答案 0 :(得分:2)

我会写下您的线性方程并对其进行整形,以使您只有一个带有未知变量的向量。例如,您上面的方程系统等于:

q1

q2

q3

可以重写:

q1

q2

q3

其结果为:

| -1  -1   0|   | T2 |   | 100 |   
|  2   0   0| . | q1 | = | 100 |   
| -1   0  -1|   | q3 |   |  0  |

答案 1 :(得分:2)

执行此操作的另一种方法是创建一个置换矩阵,以从向量中提取已知行和未知行。 这种方法稍微复杂一点,但对程序员更友好:

说您的情商。系统是:

K . T = Q

其中K3x3,而TQ3x1向量。您可以按以下方式创建置换Pf矩阵:将其乘以T时,结果是T矩阵的未知部分(仅T2),在这种情况下,置换矩阵将为1x3矩阵:

Pf = [0 1 0]

                       |100|
Tf = Pf * T = [0 1 0]* |T2 | = [T2]
                       |0  |

另一个置换矩阵将从T矩阵中获得已知部分,在您的情况下,它将是2x3矩阵:

     | 1 0 0|
Ps = | 0 0 1| 

Ts =  Ps * T = | 1 0 0|  |100|   |100|
               | 0 0 1| *| T2| = |0  |
                         |0  |   

现在一切准备就绪,您可以假设系统是这样的:

K . T = Q

K = |Kff Kfs|
    |Kfs Kss|

Q = |Qf|
    |Qs|

T = |Tf|
    |Ts|

其中f是未知右边的前缀,而s前缀是已知右边的前缀。您可以找到PfPsQfQsKffKfsKsfKss像这样:

Tf = Pf * T
Tq = Ps * T

Qf = Pf * Q
Qq = Ps * Q

Kff = pf * K * pf' (note: ' denotes the transpose)
Kfs = pf * K * ps' (note: ' denotes the transpose)
Ksf = ps * K * pf' (note: ' denotes the transpose)
Kss = ps * K * ps' (note: ' denotes the transpose)

现在需要找到未知向量TfQs

K . T = Q

|Kff Kfs| |Tf| = |Qf|
|Kfs Kss| |Ts|   |Qs|

表示:

Kff * Tf + Kfs * Ts = Qf
Kfs * Tf + Kss * Ts = Qs

从第一个开始:

Tf = Kff^-1 * (Qf - Kfs * Ts)

通过上述方程式,您可以找到Tf(请注意,所有右侧都是已知的矩阵和向量,因此需要执行数字运算)

并从第二个开始:

Qs = Kfs * Tf + Kss * Ts 

这样可以同时找到QsTf。找到TfQs后,就可以形成原始的TQ矩阵:

Q = Ps' * Qs + Pf' * Qf
T = Ps' * Ts + Pf' * Tf