x1=np.array([1,5,6,3,-1]) x2=np.arange(12).reshape(3,4) 利用Numpy求向量和矩阵的1,2范数,并说明其含义。
时间: 2023-05-18 21:03:13 浏览: 84
向量的1范数是指向量中所有元素的绝对值之和,即 ||x||1 = |x1| + |x2| + ... + |xn|。在本题中,x1的1范数为 1+5+6+3+1=16。
向量的2范数是指向量中所有元素的平方和的平方根,即 ||x||2 = sqrt(x1^2 + x2^2 + ... + xn^2)。在本题中,x1的2范数为 sqrt(1^2 + 5^2 + 6^2 + 3^2 + (-1)^2) ≈ 8.6。
矩阵的1范数是指矩阵中所有列向量的1范数的最大值,即 ||A||1 = max{ ||a1||1, ||a2||1, ..., ||an||1 },其中a1, a2, ..., an是矩阵A的列向量。在本题中,x2的1范数为 max{ |0|+|4|+|8|, |1|+|5|+|9|, |2|+|6|+|10|, |3|+|7|+|11| } = 18。
矩阵的2范数是指矩阵的最大奇异值,即矩阵A的所有特征值的平方和的平方根,即 ||A||2 = sqrt(λ1^2 + λ2^2 + ... + λn^2),其中λ1, λ2, ..., λn是矩阵A的特征值。在本题中,x2的2范数为最大奇异值,需要通过SVD分解求解。
相关问题
写出python代码x1=np.array([1,5,6,3,-1]) x2=np.arange(12).reshape(3,4) 利用Numpy求向量和矩阵的1,2范数
下面是Python代码:
```python
import numpy as np
x1 = np.array([1, 5, 6, 3, -1])
x2 = np.arange(12).reshape(3, 4)
# 求向量x1的1范数和2范数
norm_1 = np.linalg.norm(x1, ord=1)
norm_2 = np.linalg.norm(x1, ord=2)
print("向量x1的1范数为:", norm_1)
print("向量x1的2范数为:", norm_2)
# 求矩阵x2的1范数和2范数
norm_1 = np.linalg.norm(x2, ord=1)
norm_2 = np.linalg.norm(x2, ord=2)
print("矩阵x2的1范数为:", norm_1)
print("矩阵x2的2范数为:", norm_2)
```
输出结果为:
```
向量x1的1范数为: 16.0
向量x1的2范数为: 8.660254037844387
矩阵x2的1范数为: 33.0
矩阵x2的2范数为: 22.494443758403985
```
import numpy as np # 定义三角形节点坐标和单元节点关系 nodes = np.array([[0, 0], [0, 1], [1, 0]]) elems = np.array([[0, 1, 2]]) # 定义材料的弹性模量和泊松比 E = 210e9 nu = 0.3 # 计算材料的弹性矩阵 D = E / (1 - nu ** 2) * np.array([[1, nu, 0], [nu, 1, 0], [0, 0, (1 - nu) / 2]]) # 构造三角形常应变单元的刚度矩阵 def get_element_stiffness_matrix(elem): x1, y1 = nodes[elem[0]] x2, y2 = nodes[elem[1]] x3, y3 = nodes[elem[2]] A = 0.5 * abs(x1 * y2 + x2 * y3 + x3 * y1 - x1 * y3 - x2 * y1 - x3 * y2) B = np.array([[y2 - y3, 0, y3 - y1, 0, y1 - y2, 0], [0, x3 - x2, 0, x1 - x3, 0, x2 - x1], [x3 - x2, y2 - y3, x1 - x3, y3 - y1, x2 - x1, y1 - y2]]) return A * np.linalg.inv(B.T @ D @ B) # 构造整体刚度矩阵 num_nodes = nodes.shape[0] num_elems = elems.shape[0] K = np.zeros((2 * num_nodes, 2 * num_nodes)) for i in range(num_elems): elem = elems[i] ke = get_element_stiffness_matrix(elem) for r in range(3): for c in range(3): K[2 * elem[r], 2 * elem[c]] += ke[2 * r, 2 * c] K[2 * elem[r], 2 * elem[c] + 1] += ke[2 * r, 2 * c + 1] K[2 * elem[r] + 1, 2 * elem[c]] += ke[2 * r + 1, 2 * c] K[2 * elem[r] + 1, 2 * elem[c] + 1] += ke[2 * r + 1, 2 * c + 1] # 定义边界条件 fixed_nodes = [0] fixed_dofs = [2 * i for i in fixed_nodes] free_dofs = [i for i in range(2 * num_nodes) if i not in fixed_dofs] # 定义外力 F = np.zeros(2 * num_nodes) F[2] = -5000 # 求解位移场 K_ff = K[np.ix_(free_dofs, free_dofs)] F_f = F[free_dofs] u_f = np.linalg.solve(K_ff, F_f) u = np.zeros(2 * num_nodes) u[free_dofs] = u_f # 输出结果 print("位移场:") print(u.reshape(-1, 2)) print("应力场:") for i in range(num_elems): x1, y1 = nodes[elem[0]] x2, y2 = nodes[elem[1]] x3, y3 = nodes[elem[2]] elem = elems[i] u_e = u[2 * elem] B_e = np.array([[y2 - y3, 0, y3 - y1, 0, y1 - y2, 0], [0, x3 - x2, 0, x1 - x3, 0, x2 - x1], [x3 - x2, y2 - y3, x1 - x3, y3 - y1, x2 - x1, y1 - y2]]) epsilon_e = B_e @ u_e sigma_e = D @ epsilon_e print(sigma_e)这段代码中的定义边界条件和定义外力
定义边界条件的代码如下:
fixed_nodes = [0]
fixed_dofs = [2 * i for i in fixed_nodes]
其中,fixed_nodes表示被固定的节点的编号,fixed_dofs表示这些节点在整体位移场中的自由度编号,其中乘以2是因为每个节点有两个自由度(x和y方向)。这里的代码表示将节点0固定。
定义外力的代码如下:
F = np.zeros(2 * num_nodes)
F[2] = -5000
其中,F表示整体外力向量,num_nodes表示节点总数,这里的代码表示将节点2处施加一个向下的力5000N。同样乘以2是因为每个节点有两个自由度(x和y方向)。
阅读全文