1.线性规划模型案例:生产计划 假设一家工厂生产两种产品A和B,每个月有100个工作日,每个工作日可以生产200个A产品或150个B产品。A产品售价为200元/个,B产品售价为300元/个,每个月至少需要保证收入不低于200000元。制定生产计划,使得收益最大化。
代码:
复制from scipy.optimize import linprog
# 定义目标函数和约束条件
obj = [-200, -300]
lhs_eq = [[200, 150]]
rhs_eq = [200000]
bnd = [(0, None), (0, None)]
# 求解线性规划模型
opt = linprog(c=obj, A_eq=lhs_eq, b_eq=rhs_eq, bounds=bnd, method="simplex")
# 输出最优解和最优值
print("最优解为:", opt.x)
print("最优值为:", -opt.fun)
2.非线性规划模型案例:最小二乘拟合 假设有一组实验数据,要求通过拟合得到一个函数y=f(x),使得实验数据与拟合曲线的误差最小。假设拟合曲线为y=asin(bx+c),其中a、b、c为待求参数。
代码:
复制import numpy as np
from scipy.optimize import least_squares
# 定义目标函数和初始参数
def fun(params, x, y):
return params[0]*np.sin(params[1]*x+params[2]) - y
x = np.array([0.1, 0.5, 0.9, 1.3, 1.7, 2.1, 2.5, 2.9, 3.3, 3.7])
y = np.array([0.75, 0.9, 1.1, 1.4, 1.4, 1.2, 0.9, 0.6, 0.4, 0.2])
params0 = [1, 1, 0]
# 求解非线性规划模型
opt = least_squares(fun, params0, args=(x, y))
# 输出最优参数和最小误差
print("最优参数为:", opt.x)
print("最小误差为:", opt.cost)
3.动态规划模型案例:背包问题 假设有一组物品,每个物品有自己的重量和价值,现有一个容量为C的背包,要求把物品放入背包中,使得背包的总价值最大。假设每个物品只能放入一次。
代码:
def knapsack(weights, values, capacity):
n = len(weights)
dp = [[0] * (capacity+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, capacity+1):
if weights[i-1] <= j:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weights[i-1]] + values[i-1])
else:
dp[i][j] = dp[i-1][j]
return dp[n][capacity]
weights = [2, 3, 4, 5]
values = [3, 4, 5, 6]
capacity = 8
print(knapsack(weights, values, capacity))
4.插值模型案例:三次样条插值 假设有一组数据点$(x_1,y_1), (x_2,y_2), …, (x_n,y_n)$,要求通过插值得到一个函数y=f(x)。假设插值函数为三次样条插值函数。
代码:
import numpy as np
from scipy.interpolate import CubicSpline
# 定义数据点和插值函数
x = np.array([0, 1, 2, 3, 4])
y = np.array([1, 2, 3, 2.5, 1])
cs = CubicSpline(x, y)
# 输出插值结果
print("插值结果为:", cs(2.5))
5.微分方程模型案例:二阶常微分方程 假设有一个二阶常微分方程$y''+2y'+y=e^{-x}$,要求求解该微分方程的解y(x)。假设初始条件为$y(0)=0, y'(0)=1$。
代码:
from scipy.integrate import solve_ivp
import numpy as np
# 定义微分方程和初始条件
def fun(x, y):
return [y[1], np.exp(-x)-2*y[1]-y[0]]
x_span = [0, 10]
y0 = [0, 1]
# 求解微分方程
sol = solve_ivp(fun, x_span, y0)
# 输出解
print("解为:", sol.y[0])