【问题标题】:Solving a linear system of equations求解线性方程组
【发布时间】:2019-02-22 10:18:42
【问题描述】:

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

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

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

你会如何解决这样的系统?

【问题讨论】:

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


    【解决方案1】:

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

    说出你的情商。系统是:

    K . T = Q
    

    其中K3x3TQ3x1 向量。您可以创建一个排列 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
    

    【讨论】:

    • 非常感谢您抽出宝贵的时间来回答。这正是我和我的伙伴正在寻找的!我们在学习书中找到了这种方法,但很难理解它。这是一个更好的解释,谢谢!
    • @JonasJacobsen 你注意到你在另一本教科书中看到过这种方法,你能告诉我书名吗?谢谢
    【解决方案2】:

    我会写下你的线性方程并重新调整它,这样你就只有一个带有未知变量的向量。例如,您上面的方程组等于:

    可以改写:

    产生于:

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

    【讨论】:

    • 感谢您的帮助,100 应该只是移动到右侧,然后 numpy.linalg.solve 可以完成剩下的工作。
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多