cvxpy+python学习记录(自用笔记版)

在线性优化过程中,涉及参数的定义可以用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) 是不同的维度,具体原因在于这两者在形状上有区别:

  1. (96,) 是一个 一维数组(或者向量),它只有一个维度,表示有 96 个元素。这种形状通常用于表示一个简单的列表或向量。

    • 例如,在 NumPy 或 cvxpy 中,(96,) 代表一个包含 96 个元素的向量,形状是 (96,)

  2. (96, 1) 是一个 二维数组(或矩阵),其中包含 96 行和 1 列。虽然它只有 1 列,但仍然被认为是二维的。这通常表示一个列向量。

    • 例如,(96, 1) 代表一个有 96 行、1 列的矩阵或列向量,每行只有一个元素。

为什么这两者不一样?

  • 广播机制broadcast:在 NumPy 和 cvxpy 中,广播规则允许不同形状的数组在数学运算中自动对齐。但是广播机制通常要求维度一致,或其中某些维度为 1 以便扩展。(96,)(96, 1) 不会自动对齐,因为它们在维度上有所不同。

    • (96,) 被认为是一个向量,通常是一维的。

    • (96, 1) 被认为是一个列向量,或者是一个包含 96 个行的二维矩阵。                            也就是说在进行约束的计算时,要注意看,即使行数相同,(96,)和(96,1)仍然不能进行运算

 下面回到正文


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值