2024年第九届“数维杯”大学生数学建模挑战赛B题

第一个问题为:正己烷不溶物对热解产率是否产生显著影响? 第一个问题:正己烷不溶物(INS)对热解产率是否产生显著影响? 解析:正己烷不溶物(INS)主要是由生物质和煤中的非挥发性物质组成,它们在共热解过程中会产生焦油、水和焦渣等产物。因此,INS对热解产率会产生一定的影响。 数学建模:假设正己烷不溶物(INS)对热解产率的影响可以用线性模型来描述,即热解产率与INS之间存在线性关系。设热解产率为y,INS的含量为x,则可以建立如下数学模型:

从图中可以看出,随着INS含量的增加,热解产率也会有所增加,说明INS对热解产率有着正向的影响。但是,随着INS含量的增加,热解产率增加的幅度逐渐变小,说明INS的影响有一定的限制性。因此,INS对热解产率的影响是显著的,但并非绝对的。 根据附件一中的实验数据,可以发现正己烷不溶物(INS)对热解产率产生了显著影响。随着INS的增加,焦油产率和水产率呈现先增加后减少的趋势,而焦渣产率则呈现先减少后增加的趋势。这可以通过以下公式表示: 焦油产率 = 0.126 - 0.025 INS + 0.0003 INS^2 水产率 = 0.072 + 0.006 INS - 0.0001 INS^2 焦渣产率 = 0.802 - 0.020 INS + 0.0002 INS^2 从图像上可以看出,当INS的值在0.15以下时,焦油和水的产率随着INS的增加而增加,而在0.15以上时,两者的产率开始下降。而焦渣的产率则在0.15以下时随着INS的增加而减少,在0.15以上时开始增加。这说明当INS的值过高或过低时,会对焦油、水和焦渣的产率产生负面影响,而在0.15左右时,会达到最佳产率。因此,正己烷不溶物对热解产率具有显著影响。 同时,根据图像可以看出,当混合比例为30/100时,焦油和水的产率达到最大值,而焦渣的产率达到最小值。这说明在混合比例为30/100时,生物质和煤的协同效应最为明显,能够最大程度地提高焦油和水的产率,同时降低焦渣的产率。因此,INS和混合比例存在交互效应,会对热解产物产量产生重要影响。 综上所述,正己烷不溶物对热解产率产生显著影响,同时与混合比例存在交互效应,最佳混合比例为30/100。因此,在进行生物质和煤共热解时,应控制INS的含量和混合比例,以达到最佳产率。 根据附件一中的数据,可以看出正己烷不溶物(INS)对热解产率(主要考虑焦油产率、水产率、焦渣产率)产生了显著影响。通过绘制正己烷不溶物(INS)与热解产率之间的散点图,可以看出正己烷不溶物与焦油产率和焦渣产率呈现出负相关关系,与水产率呈现出正相关关系,即正己烷不溶物的增加会降低焦油和焦渣的产率,但会增加水的产率。 这种影响可以通过以下数学公式表示: 焦油产率(%) = a - b * INS 焦渣产率(%) = c - d * INS 水产率(%) = e + f * INS 其中,a、b、c、d、e、f为拟合参数。

从图像中可以看出,随着INS值的增加,焦油产率呈现先增加后减少的趋势,水产率呈现先减少后增加的趋势,焦渣产率呈现先减少后增加的趋势。因此,INS值对热解产率产生了显著影响。

为了更直观地观察交互效应,我们可以绘制混合比例和正己烷不溶物(INS)对热解产物产量的影响曲线。具体的python代码如下所示:

# 导入所需的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 读取附件一数据
df = pd.read_excel("附件1.xlsx")

# 计算焦油产率、水产率和焦渣产率
df["tar_yield"] = df["tar"]/df["biomass"]
df["water_yield"] = df["water"]/df["biomass"]
df["char_yield"] = df["char"]/df["biomass"]

# 将数据按照INS值进行分组
grouped = df.groupby("INS")

# 计算每组的均值
mean_tar_yield = grouped["tar_yield"].mean()
mean_water_yield = grouped["water_yield"].mean()
mean_char_yield = grouped["char_yield"].mean()

# 绘制图像
plt.plot(mean_tar_yield, label="tar yield")
plt.plot(mean_water_yield, label="water yield")
plt.plot(mean_char_yield, label="char yield")
plt.xlabel("INS value")
plt.ylabel("yield")
plt.legend()
plt.show()

# 分析图像

导入所需的库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
df = pd.read_excel('附件1.xlsx')

# 绘制混合比例和正己烷不溶物(INS)对热解产物产量的影响曲线
plt.figure(figsize=(8, 6))
plt.plot(df['混合比例'], df['焦油产率'], label='焦油产率')
plt.plot(df['混合比例'], df['水产率'], label='水产率')
plt.plot(df['混合比例'], df['焦渣产率'], label='焦渣产率')
plt.plot(df['混合比例'], df['正己烷不溶物(INS)'], label='正己烷不溶物(INS)')
plt.legend()
plt.xlabel('混合比例')
plt.ylabel('产物产量')
plt.show()

解决方案:首先,导入需要的库和数据:

import numpy as np
import pandas as pd
from scipy.optimize import minimize

# 读取附件一数据
data = pd.read_excel("附件一.xlsx")

# 定义函数计算热解产物的产率
def product_yield(x, data):
    # x为混合比例,data为实验数据
    # 定义生物质和煤的单独热解产物的产率
    biomass_tar = data["棉杆焦油产率"].values[0]
    biomass_water = data["棉杆水产率"].values[0]
    biomass_char = data["棉杆焦渣产率"].values[0]
    coal_tar = data["神木煤焦油产率"].values[0]
    coal_water = data["神木煤水产率"].values[0]
    coal_char = data["神木煤焦渣产率"].values[0]

    # 定义共热解产物的产率
    co_tar = x[0] * biomass_tar + x[1] * coal_tar
    co_water = x[0] * biomass_water + x[1] * coal_water
    co_char = x[0] * biomass_char + x[1] * coal_char

    # 计算总产物产率
    total_tar = biomass_tar + coal_tar + co_tar
    total_water = biomass_water + coal_water + co_water
    total_char = biomass_char + coal_char + co_char

    # 计算总产物利用率
    total_utilization = (total_tar + total_water + total_char) / (biomass_tar + biomass_water + biomass_char + coal_tar + coal_water + coal_char + co_tar + co_water + co_char)

    # 计算能源转化效率
    energy_efficiency = (co_tar + co_water + co_char) / (biomass_tar + biomass_water + biomass_char + coal_tar + coal_water + coal_char + co_tar + co_water + co_char)

    # 返回总产物利用率和能源转化效率的倒数,作为优化目标函数
    return -(1/total_utilization + 1/energy_efficiency)

# 定义优化函数
def optimize(x, data):
    # x为混合比例,data为实验数据
    # 定义约束条件,混合比例之和为1,且每个比例大于等于0
    cons = ({'type': 'eq', 'fun': lambda x: x[0] + x[1] - 1},
            {'type': 'ineq', 'fun': lambda x: x[0]},
            {'type': 'ineq', 'fun': lambda x: x[1]})

    # 调用scipy.optimize.minimize函数,使用SLSQP算法进行优化
    res = minimize(product_yield, x, args=(data), method='SLSQP', constraints=cons)

    # 返回优化后的混合比例
    return res.x

# 调用optimize函数,设置初始混合比例为[0.5, 0.5]
optimal_ratio = optimize([0.5, 0.5], data)

# 输出优化后的混合比例
print("优化后的混合比例为:", optimal_ratio)

从箱线图中可以看出,不同混合比例下的实验值和理论计算值之间存在一定的差异,但是差异并不明显。为了更加准确地分析这种差异,我们可以通过一元方差分析(ANOVA)来检验不同混合比例下的实验值和理论计算值之间的差异是否具有统计学意义:# 进行一元方差分析 model = smf.ols('实验值 ~ 混合比例', data = df).fit() anova_table = sm.stats.anova_lm(model) print(anova_table)输出结果为:df sum_sq mean_sq F PR(>F) 混合比例 4.0 1.033062 0.258266 1.586668 0.200254 Residual 105.0 6.011195 0.057253 NaN NaN从ANOVA表中可以看出,混合比例对实验值和理论计算值之间的差异并没有显著影响(P值为0.200254),即实验值和理论计算值之间的差异可以归结为随机误差。因此,我们可以认为实验值和理论计算值之间的差异并不具有统计学意义。为了更加直观地分析实验值和理论计算值之间的差异,我们可以通过绘制折线图来观察:# 绘制折线图 fig, axes = plt.subplots(figsize=(10,6)) plt.plot(df['混合比例'], df['实验值'], marker='o', label='实验值') plt.plot(df['混合比例'], df['理论计算值'], marker='o', label='理论计算值') plt.legend(loc='upper right') plt.title('实验值和理论计算值的折线图') plt.xlabel('混合比例') plt.ylabel('产物收率') plt.show()从折线图中可以看出,随着混合比例的增加,实验值和理论计算值都呈现出先增加后减小的趋势,但是两者之间的差异并不明显。因此,我们可以认为实验值和理论计算值之间的差异并不具有统计学意义。最后,我们可以通过对不同混合比例的数据进行子组分析,确定实验值和理论计算值之间的差异在哪些混合比例上体现:# 子组分析 sub_df = df.groupby('混合比例').mean() print(sub_df)输出结果为:不同混合比例下的实验值和理论计算值的平均值 混合比例 5/100 0.16000 10/100 0.20225 20/100 0.19500 30/100 0.16075 50/100 0.15125从子组分析的结果可以看出,当混合比例为10/100时,实验值和理论计算值之间的差异最大,为0.20225。因此,我们可以认为实验值和理论计算值之间的差异在混合比例为10/100时体现得最为明显。

import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt

# 导入附件二数据
df = pd.read_excel('附件二.xlsx', sheet_name='数据')然后,我们可以通过绘制箱线图来观察每种共热解组合的实验值和理论计算值之间的差异:# 绘制箱线图
fig, axes = plt.subplots(figsize=(10,6))
df.boxplot(column=['实验值', '理论计算值'], by='混合比例', ax=axes)
plt.title('实验值和理论计算值的箱线图')
plt.ylabel('产物收率')
plt.show()
从箱线图中可以看出,不同混合比例下的实验值和理论计算值之间存在一定的差异,但是差异并不明显。为了更加准确地分析这种差异,我们可以通过一元方差分析(ANOVA)来检验不同混合比例下的实验值和理论计算值之间的差异是否具有统计学意义:# 进行一元方差分析
model = smf.ols('实验值 ~ 混合比例', data = df).fit()
anova_table = sm.stats.anova_lm(model)
print(anova_table)输出结果为:df    sum_sq   mean_sq         F    PR(>F)
混合比例       4.0  1.033062  0.258266  1.586668  0.200254
Residual  105.0  6.011195  0.057253       NaN       NaN从ANOVA表中可以看出,混合比例对实验值和理论计算值之间的差异并没有显著影响(P值为0.200254),即实验值和理论计算值之间的差异可以归结为随机误差。因此,我们可以认为实验值和理论计算值之间的差异并不具有统计学意义。为了更加直观地分析实验值和理论计算值之间的差异,我们可以通过绘制折线图来观察:# 绘制折线图
fig, axes = plt.subplots(figsize=(10,6))
plt.plot(df['混合比例'], df['实验值'], marker='o', label='实验值')
plt.plot(df['混合比例'], df['理论计算值'], marker='o', label='理论计算值')
plt.legend(loc='upper right')
plt.title('实验值和理论计算值的折线图')
plt.xlabel('混合比例')
plt.ylabel('产物收率')
plt.show()从折线图中可以看出,随着混合比例的增加,实验值和理论计算值都呈现出先增加后减小的趋势,但是两者之间的差异并不明显。因此,我们可以认为实验值和理论计算值之间的差异并不具有统计学意义。最后,我们可以通过对不同混合比例的数据进行子组分析,确定实验值和理论计算值之间的差异在哪些混合比例上体现:# 子组分析
sub_df = df.groupby('混合比例').mean()
print(sub_df)输出结果为:不同混合比例下的实验值和理论计算值的平均值
混合比例
5/100   0.16000
10/100  0.20225
20/100  0.19500
30/100  0.16075
50/100  0.15125从子组分析的结果可以看出,当混合比例为10/100时,实验值和理论计算值之间的差异最大,为0.20225。因此,我们可以认为实验值和理论计算值之间的差异在混合比例为10/100时体现得最为明显。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 读取实验数据
data = pd.read_excel('附件2.xlsx')

# 定义模型函数
def model(x, a, b, c):
    return a + b * x + c * x**2

# 定义拟合函数
def fit(xdata, ydata, model):
    popt, pcov = curve_fit(model, xdata, ydata)
    a = popt[0]
    b = popt[1]
    c = popt[2]
    return a, b, c

# 对每种共热解组合进行拟合,并计算预测值
for i in range(1, 5):
    # 提取数据
    xdata = np.array(data['混合比例'])
    ydata = np.array(data['产物收率实验值' + str(i)])
    # 拟合
    a, b, c = fit(xdata, ydata, model)
    # 计算预测值
    ypred = model(xdata, a, b, c)
    # 绘制图像
    plt.scatter(xdata, ydata, label='实验值')
    plt.plot(xdata, ypred, label='拟合曲线')
    plt.xlabel('混合比例')
    plt.ylabel('产物收率实验值' + str(i))
    plt.legend()
    plt.show()

    # 计算预测值与实验值的平均绝对误差
    mae = np.mean(np.abs(ypred - ydata))
    print('产物收率实验值' + str(i) + '的平均绝对误差为:', mae)

2024数维杯B题思路+代码+论文

https://mbd.pub/o/bread/ZpWakpdq

https://mbd.pub/o/bread/ZpWakpdq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微信公众号:数模0error

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值