Gekko非线性回归分析

参考链接:https://www.youtube.com/watch?v=sGZbQgDOfi4&list=PLLBUgWXdTBDjcqDl2e5F_hcBjEc6vjr1X&index=19

对已有影响石油价格的数据进行非线性建模,非线性模型为:
o i l p r i c e = a ∗ W T I b ∗ H H c ∗ N G L d oil_{price}=a*WTI^{b}*HH^{c}*NGL^{d} oilprice=aWTIbHHcNGLd
优化目标函数为:
∑ ( o i l p r e d − o i l m e a s u r e d o i l m e a s u r e d ) 2 \sum(\frac{oil_{pred}-oil_{measured}}{oil_{measured}})^2 (oilmeasuredoilpredoilmeasured)2

数据示例如下:
在这里插入图片描述利用Gekko库的模型求解程序如下:

import numpy as np
from gekko import GEKKO
import pandas as pd
import matplotlib.pyplot as plt

# 1. read txt file using pandas
# txt_file =r'http://apmonitor.com/me575/uploads/Main/oil_data.txt'
txt_file = r"D:\Files\python\gekko\oil_data.txt"
data = pd.read_csv(txt_file)

xml1 = np.array(data['WTI_PRICE'])
xml2 = np.array(data['HH_PRICE'])
xml3 = np.array(data['NGL_PRICE'])
ym = np.array(data['BEST_PRICE'])

# 2. GEKKO model
m = GEKKO(remote=False)

# 设置非线性模型中的4个变量
a = m.FV(lb=-100,ub=100)
b = m.FV(lb=-100,ub=100)
c = m.FV(lb=-100,ub=100)
d = m.FV(lb=-100,ub=100)
a.STATUS = 1
b.STATUS = 1
c.STATUS = 1
d.STATUS = 1

# 设置影响石油价格的三个变量
x1 = m.Param(value=xml1)
x2 = m.Param(value=xml2)
x3 = m.Param(value=xml3)
z = m.Param(value=ym)
y = m.Var()

# 设置约束和目标函数
m.Equation(y==a*(x1**b)*(x2**c)*(x3**d))
# m.Equation(y==a*x1**2+b*x2**2+c*x3**2+d)
m.Obj(((y-z)/z)**2)

m.options.IMODE = 2
m.options.SOLVER = 1

# 模型求解
m.solve()

print('a: ', a.value[0])
print('b: ', b.value[0])
print('c: ', c.value[0])
print('d: ', d.value[0])
cFormular = 'Formular is: '+'\n'+\
    r'$A * WTI^B * HH^C * PROPANE^D$'

from scipy import stats
slope, intercept, r_value, p_value, \
    std_err = stats.linregress(ym, y)
r2 = r_value**2
cR2 = "R^2 = "+str(r_value**2)

plt.figure()
plt.plot([20,140],[20,140],'k-',label='Measured')
plt.plot(ym,y,'ro',label='Predicted')
plt.xlabel('Measured Outcome (YM)')
plt.ylabel('Predicted Outcome (Y)')
plt.legend(loc='best')
plt.text(25,115,'a ='+str(a.value[0]))
plt.text(25,110,'b ='+str(b.value[0]))
plt.text(25,105,'c ='+str(c.value[0]))
plt.text(25,100,'d ='+str(d.value[0]))
plt.text(25,90, cR2)
plt.text(80,40, cFormular)
plt.grid()
plt.show()

输出结果为:
在这里插入图片描述可以看到预测结果y和观察结果ym非常接近,如果将模型修改**(修改m.Equation表达式)**为以下:
o i l p r i c e = a ∗ W T I 2 + b ∗ H H 2 + c ∗ N G L 2 + d oil_{price}=a*WTI^{2}+b*HH^{2}+c*NGL^{2}+d oilprice=aWTI2+bHH2+cNGL2+d
得到以下结果:
在这里插入图片描述通过两种结果的对比可以知道非线性模型可以更好的描述石油价格与三种影响因素之间的关系。

这些模块有哪些要安装的 在数学建模竞赛中,Python 凭借其丰富的科学计算和灵活性成为重要工具。以下是 Python 在数学建模中的核心应用领域及相关工具,按模块分类整理: --- ### **一、基础科学计算与数据处理** 1. **数值计算** - **NumPy**:矩阵运算、线性代数、随机数生成 - **SciPy**:积分/微分求解、优化算法、插值、傅里叶变换 - **SymPy**:符号计算(符号求导、方程解析解) 2. **数据处理** - **Pandas**:数据清洗、时间序列分析、表格操作 - **OpenPyXL**:Excel 文件交互 - **SQLAlchemy**:数据连接(如需外部数据) --- ### **二、建模与算法实现** 1. **经典数学模型** - **Scikit-learn**:回归/分类/聚类(如线性回归、SVM、K-Means) - **Statsmodels**:统计模型(假设检验、时间序列ARIMA) 2. **优化问题** - **PuLP/CVXPY**:线性/整数规划建模 - **SciPy.optimize**:非线性规划求解器 - **GEKKO**:动态系统优化(化工、控制领域) 3. **图论与网络分析** - **NetworkX**:复杂网络建模(最短路径、PageRank算法) 4. **微分方程** - **ODEINT(SciPy)**:常微分方程数值解 - **FEniCS**:偏微分方程有限元法(高阶需求) --- ### **三、数据可视化** 1. **基础绘图** - **Matplotlib**:2D/3D静态图绘制 - **Seaborn**:统计图表美化(热力图、分布图) 2. **交互式可视化** - **Plotly**:动态可交互图表(地图、3D轨迹) - **Bokeh**:网页端交互可视化 3. **地理信息** - **Basemap/Cartopy**:地理空间数据可视化 --- ### **四、高级工具链** 1. **自动化建模** - **AutoML(TPOT/Auto-Sklearn)**:自动机器学习(时间紧迫时) 2. **高性能计算** - **Numba**:加速数值计算(基于JIT编译) - **Dask**:并行计算(大数据集处理) 3. **文档生成** - **Jupyter Notebook**:代码/公式/图表混合排版 - **Latex**:通过`pythontex`包与Python联动 --- ### **五、特殊场景工具** 1. **图像处理** - **OpenCV**:图像识别、特征提取(如卫星图像分析) 2. **文本分析** - **NLTK/Spacy**:自然语言处理(舆情类赛题) 3. **物理仿真** - **PyBullet**:刚体动力学模拟(机械控制类题目) --- ### **六、效率提升技巧** - **代码调试**:`pdb`调试器 + `logging`日志记录 - **版本控制**:Git + GitHub/Gitee 团队协作 - **环境管理**:`conda`虚拟环境隔离依赖项 - **API调用**:`requests`获取实时数据(如天气、经济指标) --- ### **典型应用场景示例** 1. **预测类题目**:ARIMA(Statsmodels) + LSTM(PyTorch) 2. **优化调度题**:整数规划(PuLP) + 遗传算法(DEAP) 3. **评价模型题**:熵权法(NumPy) + TOPSIS(Pandas) 4. **动态系统题**:微分方程(SciPy) + 相空间图(Matplotlib) --- ### **注意事项** 1. **避免过度复杂**:优先使用成熟重复造轮子 2. **结果可解释性**:关键步骤添加注释,便于论文复现 3. **资源管理**:大数据场景注意内存控制(使用生成器/分块读取) 建议赛前重点掌握:NumPy/Pandas数据处理链 + Matplotlib/Seaborn可视化 + Scikit-learn基础模型,这些覆盖80%常规需求。特殊题型(如神经网络、复杂优化)可针对性扩展。
最新发布
03-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值