我需要帮助设置矩阵以在 Python 中使用高斯消去法求解
I need help setting up matrices to solve using Gaussian elimination in Python
提前向那些必须阅读我糟糕的编码技能的人致歉
本次编码的objective是先建立一个17x17的矩阵,用线性代数中的方法求解17个未知数。
我最难的部分是:
实现 2 个计数器 i 和 j,其中 i 的值将在 j 的值达到其限制并再次回到 0 时增加。
最后,能够将新值插入单个数组以供以后操作。我试过用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
我正在尝试为那些感兴趣的人获得轴对称流中的斯托克斯流函数,
我将不胜感激任何类型的反馈,请指导我正确的方向
您的代码有两个错误。第一个是Python,你从零开始数;你可能认为你的矩阵有 17 行,从 1 到 17,但是 Python 认为它是从 0 到 16。第二个是当使用 numpy 时,你应该先构建你的数组,然后插入你的计算值。这里有一个很好的解释:(How do I create an empty array/matrix in NumPy?)。
为了保持一致性,我将 r 设为一个数组,并将计算出的值插入到 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
下面的代码是针对您的问题的向量化解决方案:
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
是二维数组而不是向量:
>>> 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. ]])
希望这就是您要找的结果。
注意为了保存space,只显示一位小数。
您可能会发现查看 Numpy 文档中函数 mgrid and the object newaxis 的描述有助于了解此代码的工作原理。
提前向那些必须阅读我糟糕的编码技能的人致歉
本次编码的objective是先建立一个17x17的矩阵,用线性代数中的方法求解17个未知数。
我最难的部分是:
实现 2 个计数器 i 和 j,其中 i 的值将在 j 的值达到其限制并再次回到 0 时增加。
最后,能够将新值插入单个数组以供以后操作。我试过用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
我正在尝试为那些感兴趣的人获得轴对称流中的斯托克斯流函数,
我将不胜感激任何类型的反馈,请指导我正确的方向
您的代码有两个错误。第一个是Python,你从零开始数;你可能认为你的矩阵有 17 行,从 1 到 17,但是 Python 认为它是从 0 到 16。第二个是当使用 numpy 时,你应该先构建你的数组,然后插入你的计算值。这里有一个很好的解释:(How do I create an empty array/matrix in NumPy?)。
为了保持一致性,我将 r 设为一个数组,并将计算出的值插入到 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
下面的代码是针对您的问题的向量化解决方案:
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
是二维数组而不是向量:
>>> 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. ]])
希望这就是您要找的结果。
注意为了保存space,只显示一位小数。
您可能会发现查看 Numpy 文档中函数 mgrid and the object newaxis 的描述有助于了解此代码的工作原理。