习题4
学号后四位3026 1班
4.3
import cvxpy as cp
import pylab as plt
import numpy as np
定义变量和目标函数
x = cp.Variable(6, pos=True)
obj = cp.Minimize(x[5])
定义约束条件的系数
a1 = np.array([0.025, 0.015, 0.055, 0.026])
a2 = np.array([0.05, 0.27, 0.19, 0.185, 0.185])
a3 = np.array([1, 1.01, 1.02, 1.045, 1.065])
初始化参数和结果列表
k = 0.05
kk = []
qq = []
循环求解优化问题
while k < 0.27:
定义约束条件
con = [cp.multiply(a1, x[1:5]) - x[5] <= 0,
a2 @ x[:-1] >= k,
a3 @ x[:-1] == 1]
创建优化问题
prob = cp.Problem(obj, con)
使用ECOS求解器求解问题
prob.solve(solver='ECOS')
存储结果
kk.append(k)
qq.append(prob.value)
更新参数k
k += 0.005
绘图
plt.rc('text', usetex=False)
plt.rc('font', size=16)
注意:如果系统中没有SimHei字体,可能会显示乱码或默认字体
可以尝试使用其他中文字体,或者将标签改为英文
plt.rc('font', family='SimHei') # 如果SimHei不可用,请替换为其他字体或删除此行
plt.plot(kk, qq, 'k')
plt.plot(kk, qq, 'b.')
plt.xlabel("收益 k")
plt.ylabel("风险 Q")
plt.show()
4.4
import numpy as np
from scipy.optimize import linprog
c = [-2, -1]
A = [
[0, 5],
[3, 1],
[1, 1]
]
b = [
15,
12,
5
]
x_bounds = (0, None)
y_bounds = (0, None)
bounds = [x_bounds, y_bounds]
result = linprog(c, A_ub=A, b_ub=b, bounds=bounds, method='highs')
if result.success:
x_opt = int(result.x[0])
y_opt = int(result.x[1])
max_profit = -result.fun
print(f"最优解为:x = {x_opt}, y = {y_opt}")
print(f"最大利润为:{max_profit}元")
else:
print("未找到可行解")