在线性优化过程中,涉及参数的定义可以用numpy库,先把计算相关的参数定义了,然后定义决策变量、约束、目标函数
1.使用numpy进行参数的定义
首先要调用numpy:
import numpy as np
a.创建一个数组
list=np.array([1,2,3,4,5])
print(list)
输出结果为[1 2 3 4 5]
b.用.zeros创建一个全0,3行2列数组,numpy中数组可以是一维,二维,更高维。
二维用来存放矩阵或表格数据
list1 = np.zeros((3,2)) print(list1)输出结果为[[0. 0.]
[0. 0.]
[0. 0.]]
c.获取数组尺寸
print(list1.shape) print(list.shape)输出结果为
(3, 2)
(5,)
d.用.ones创建一个全是1的数组
list2 = np.ones((4,5)) print(list2)输出结果为
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
e.用.arange创建一个递增/递减数组
list3 = np.arange(2,5)
print(list3)
输出:[2 3 4]
f.用.linspace创建返回某个区间,等间距分布的数(前面两个数是区间范围,最后一个数是输出的数的个数
list4 = np.linspace(1,8,4) print(list4)输出:[1. 3.33333333 5.66666667 8. ]
g.用.random.rand生成随机数组
list5 = np.random.rand(3,2) print(list5)[[0.43975477 0.46742094]
[0.7701841 0.24695614]
[0.60912833 0.62784083]]
PS:numpy中数组默认类型是64位浮点数,可使用.dtype转换 ,现有数组,用.astype转换类型
list6 = np.ones((4,5),dtype=np.int32)
b = list5.astype(int) print(b)输出:
[[0 0]
[0 0]
[0 0]]
h.用.dot进行数组的点乘
np.dot(a,b)
i.a*b,a+b,a/b 对数组同位置的元素进行运算;a@b 进行矩阵的乘法
j.用.sqrt对每个元素进行求平方根
list7 = np.sqrt(list) print(list7)输出:
[1. 1.41421356 1.73205081 2. 2.23606798]
k.用.axis=0(第一个维度)代表行对应相加,=1(第二个维度)代表列相加
list8 = np.array([[1,2,3,5], [4,5,7,9]]) list9 = list8.sum(axis=0) print(list9)[ 5 7 10 14]
2.cvxpy定义决策变量
(1)变量可以是常数、向量、矩阵(即变量可以是0,1,2维)
x = cp.Variable()#变量是标量
x = cp.Variable(integer=Ture)#变量是整数,默认一般是实数
x = cp.Variable(5)#变量是向量,是列向量(而不是一维数组或行向量),即它是包含5个元素的向量,形状显示为(5,)
x = cp.Variable((4,6))#(4,6)的矩阵
import cvxpy as cp
x = cp.Variable(5)
print(x.shape) # 输出:(5,)
如果想要让x变量作为行向量使用,利用转置
x_T = x.T # 将列向量 x 转换为行向量
print(x_T.shape) # 输出:(1, 5)
3.cvxpy定义约束
(未完待续------记于2024.11.21日
PS:这里插入一个广播机制
在 Python 中,(96,)
和 (96, 1)
是不同的维度,具体原因在于这两者在形状上有区别:
-
(96,)
是一个 一维数组(或者向量),它只有一个维度,表示有 96 个元素。这种形状通常用于表示一个简单的列表或向量。-
例如,在 NumPy 或 cvxpy 中,
(96,)
代表一个包含 96 个元素的向量,形状是(96,)
。
-
-
(96, 1)
是一个 二维数组(或矩阵),其中包含 96 行和 1 列。虽然它只有 1 列,但仍然被认为是二维的。这通常表示一个列向量。-
例如,
(96, 1)
代表一个有 96 行、1 列的矩阵或列向量,每行只有一个元素。
-
为什么这两者不一样?
-
广播机制broadcast:在 NumPy 和
cvxpy
中,广播规则允许不同形状的数组在数学运算中自动对齐。但是广播机制通常要求维度一致,或其中某些维度为 1 以便扩展。(96,)
和(96, 1)
不会自动对齐,因为它们在维度上有所不同。-
(96,)
被认为是一个向量,通常是一维的。 -
(96, 1)
被认为是一个列向量,或者是一个包含 96 个行的二维矩阵。 也就是说在进行约束的计算时,要注意看,即使行数相同,(96,)和(96,1)仍然不能进行运算
-
下面回到正文