2016-04-21 113 views
0

道歉提前那些誰擁有通過我糟糕的編碼技術我需要幫助建立矩陣用高斯消元法在Python

這種編碼的目的是首先開發一個17×17矩陣,解決了閱讀解決使用線性代數中提出的方法的17個未知數。

的部分我遇到的最大的困難是:

  1. 實現2個計數器i和j,這裏曾經j值達到了極限,再回到0 i的值將增加。

  2. 最後,能夠將新值插入單個數組以供稍後操作。我嘗試使用np.insert,np.hstack,np.vstack,np.append等無法正常工作。

這樣我就可以生成矩陣,看起來像

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 

我試圖獲得斯托克斯流功能軸對稱的流動對於那些誰有興趣,

我會很感激任何類型的反饋,請指導我在右邊的di反應

回答

0

所以你的代碼有兩個錯誤。第一個在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

@NamKang:使用魔術常數(如17)被認爲是**糟糕的編程習慣**。如果您通過添加或刪除某些元素來更改'r'的大小,除非您手動將值'17'替換爲'r'的新大小,否則上述代碼將無法正常工作(同樣適用於值'16 '出現在while循環中)。這就是爲什麼我在我的解決方案中引入變量'R'的原因。 – Tonechas

+0

如果我已經知道這些值中的某些值會變爲零,那麼是否有辦法避免執行這些計算? –

0

下面的代碼是一個矢量解決問題的方法:

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 

結果k2是一個2維陣列而不是一個矢量:

>>> 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. ]]) 

希望這是結果你正在尋找。

請注意,爲了節省空間,只顯示一位十進制數字。

您可能會發現在Numpy的文檔中查看功能mgrid和對象newaxis的描述以幫助您弄清楚此代碼的工作原理。