2016-04-21 5 views
0

Извиняюсь заранее, чтобы те, кто должен прочитать мою бедную умение кодированиямне нужна помощь в настройке матрицы для решения с помощью метода исключения Гаусса в Python

Цель этого кодирования заключается в первую разработать матрицу 17х17 и решить для 17 неизвестных, используя методы, представленные в линейной алгебре.

Части я имею наибольшую трудность представляет:

  1. реализация 2 счетчика I и J, где значение умножит когда значение J достигает свой предел и возвращается к 0 снова.

  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 

Я пытаюсь получить функцию потока Стокс в осесимметричной потоке для тех, кто заинтересованный,

Буду признателен за любые отзывы, пожалуйста, направьте меня в правильном порядке rection

ответ

0

Таким образом, ваш код страдает двумя ошибками. Первое, что в python, вы начинаете считать с нуля; вы можете подумать о том, что ваша матрица имеет 17 строк, от 1 до 17, но python видит, что она идет от 0 до 16. Во-вторых, при работе с numpy вы должны сначала построить свой массив, а затем вставить ваши вычисленные значения. Есть хорошее объяснение, почему здесь :(How do I create an empty array/matrix in NumPy?).

Я сделал r массив для согласованности, и я вставил вычисленные значения в k2. Я не уверен, что это было для меня.

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

Надеюсь, это результат вы искали.

Обратите внимание, что для экономии места отображается только одна десятичная цифра.

Возможно, вам будет полезно ознакомиться с описанием функции mgrid и объектом newaxis в документации Numpy, чтобы выяснить, как работает этот код.