我需要帮助设置矩阵来解决在Python中使用高斯消元法

时间:2016-04-21 17:14:03

标签: python numpy matrix physics numerical-methods

提前向那些必须阅读我糟糕的编码技巧的人道歉

这种编码的目的是首先开发一个17x17矩阵,并使用线性代数中提供的方法求解17个未知数。

我遇到的最困难的部分是:

  1. 实现2个计数器i和j,其中i的值将在j的值达到其极限时增加并再次返回到0。

  2. 最后,能够将新值插入单个数组以供以后操作。我尝试使用np.insert,np.hstack,np.vstack,np.append等无法正常工作。

  3. 所以我可以生成看起来像

    的矩阵
    x11 x12 x13....x1j 
    x21 .......... x2j
    xi1............xij
    

    这是一些尝试

    import numpy as np
    import math as mt
    r=[2,2.8,3.2,3.5,3.7,3.8,3.8,3.8,3.8,3.8,3.8,3.8,3.7,3.5,3.2,2.8,2]
    n=np.linspace(1,17,17)
    m=np.linspace(1,17,17)
    i=0
    k=np.array([])
    l=1
    k2=[]
    while i <=18:
        for j in range(17):
            h1=mt.sqrt(r[i]**2+(l*(n[i]-m[j])+l/2)**2)
            h2=mt.sqrt(r[i]**2+(l*(n[i]-m[j])-l/2)**2)
            h=h1-h2    
            k2.append(h)
            i=i+1
    

    我试图为那些感兴趣的人获得轴向对称流动中的斯托克斯流函数,

    我会感谢任何类型的反馈,请指导我正确的方向

2 个答案:

答案 0 :(得分:1)

您的代码有两个错误。第一个在Python中,你开始从零开始计算;你可能会认为你的矩阵有17行,1到17,但Python认为它从0到16。第二个是当使用numpy时,你应该首先构建你的数组,然后插入你的计算值。这里有一个很好的解释原因:(How do I create an empty array/matrix in NumPy?)。

为了保持一致性,我制作了一个数组,并将计算出的值插入到k2中。我不确定k是不是。

import numpy as np
import math as mt

r=np.array([2,2.8,3.2,3.5,3.7,3.8,3.8,3.8,3.8,3.8,3.8,3.8,3.7,3.5,3.2,2.8,2])
n=np.linspace(1,17,17)
m=np.linspace(1,17,17)
l=1

k2 = np.empty(shape=(17,17))
i=0
j=0
while i <=16:
    while j<=16: 
        h1=mt.sqrt(r[i]**2+(l*(n[i]-m[j])+l/2)**2)
        h2=mt.sqrt(r[i]**2+(l*(n[i]-m[j])-l/2)**2)
        h=np.array(h1-h2)    
        k2[i,j]= h
        j+=1
    j=0    
    i+=1

答案 1 :(得分:0)

The code below is a vectorized solution to your problem:

import numpy as np

r = np.asarray([2,2.8,3.2,3.5,3.7,3.8,3.8,3.8,3.8,3.8,3.8,3.8,3.7,3.5,3.2,2.8,2])
l = 1

R = r.size
n, m = np.mgrid[1:R+1, 1:R+1]

h1 = np.sqrt(r[:, np.newaxis]**2 + (l*(n-m) + l/2.)**2)
h2 = np.sqrt(r[:, np.newaxis]**2 + (l*(n-m) - l/2.)**2)
k2 = h1 - h2

The result k2 is a 2-dimensional array rather than a vector:

>>> np.set_printoptions(precision=1)
>>> k2
array([[ 0. , -0.4, -0.7, -0.8, -0.9, -0.9, -0.9, -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. ],
       [ 0.3,  0. , -0.3, -0.6, -0.7, -0.8, -0.9, -0.9, -0.9, -0.9, -1. , -1. , -1. , -1. , -1. , -1. , -1. ],
       [ 0.5,  0.3,  0. , -0.3, -0.5, -0.7, -0.8, -0.8, -0.9, -0.9, -0.9, -0.9, -1. , -1. , -1. , -1. , -1. ], 
       [ 0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.8, -0.8, -0.9, -0.9, -0.9, -0.9, -0.9, -1. , -1. , -1. ],
       [ 0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.9, -0.9, -0.9, -0.9, -0.9, -0.9, -1. ],
       [ 0.8,  0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9, -0.9, -0.9, -0.9, -0.9],
       [ 0.8,  0.8,  0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9, -0.9, -0.9, -0.9],
       [ 0.9,  0.8,  0.8,  0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9, -0.9, -0.9],
       [ 0.9,  0.9,  0.8,  0.8,  0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9, -0.9],
       [ 0.9,  0.9,  0.9,  0.8,  0.8,  0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9],
       [ 0.9,  0.9,  0.9,  0.9,  0.8,  0.8,  0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8],
       [ 0.9,  0.9,  0.9,  0.9,  0.9,  0.8,  0.8,  0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7, -0.8],
       [ 1. ,  0.9,  0.9,  0.9,  0.9,  0.9,  0.9,  0.8,  0.7,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6, -0.7],
       [ 1. ,  1. ,  1. ,  0.9,  0.9,  0.9,  0.9,  0.9,  0.8,  0.8,  0.6,  0.5,  0.3,  0. , -0.3, -0.5, -0.6],
       [ 1. ,  1. ,  1. ,  1. ,  1. ,  0.9,  0.9,  0.9,  0.9,  0.8,  0.8,  0.7,  0.5,  0.3,  0. , -0.3, -0.5],
       [ 1. ,  1. ,  1. ,  1. ,  1. ,  1. ,  1. ,  0.9,  0.9,  0.9,  0.9,  0.8,  0.7,  0.6,  0.3,  0. , -0.3],
       [ 1. ,  1. ,  1. ,  1. ,  1. ,  1. ,  1. ,  1. ,  1. ,  1. ,  0.9,  0.9,  0.9,  0.8,  0.7,  0.4,  0. ]])

Hopefully this is the result you were looking for.

Notice that in order to save space, only one decimal digit is displayed.

You may find it helpful to have a look on the description of the function mgrid and the object newaxis in Numpy's documentation to figure out how this code works.