2024年第二届“华数杯”国际大学生数学建模竞赛B题(ICM)光伏发电深度剖析|详细建模过程+代码实现

文章讲述了如何使用Python和Matlab中的相关库(如numpy、scipy.optimize和sklearn.metrics)构建非线性模型,对能源数据进行预测,并通过残差分析和正态性检验评估模型性能。作者提供了实例代码,展示了从数据处理到模型优化的完整过程。
摘要由CSDN通过智能技术生成

赛题回顾:

问题1的详细解答如下:

python示例代码如下:

import numpy as np
from scipy.optimize import minimize
from sklearn.metrics import r2_score
import matplotlib.pyplot as plt


np.random.seed(42)
time_points = np.arange(1, 101)
E_traditional = np.random.rand(100) * 50
E_renewable = np.random.rand(100) * 30
E_other = np.random.rand(100) * 20
observed_E = 5 + 2 * np.exp(0.1 * E_traditional) + 1.5 * np.log(0.5 * E_renewable + 1) + 0.5 * np.power(E_other, 0.7) + np.random.normal(0, 5, 100)

# 定义目标函数(残差平方和)
def objective(params, *args):
    E_traditional, E_renewable, E_other, observed_E = args
    predicted_E = params[0] + params[1] * np.exp(params[2] * E_traditional) + \
                   params[3] * np.log(params[4] * E_renewable + 1) + \
                   params[5] * np.power(E_other, params[6])
    residuals = observed_E - predicted_E
    return np.sum(residuals**2)

# 初始参数估计值
initial_params = np.ones(7)

# 优化参数
result = minimize(objective, initial_params, args=(E_traditional, E_renewable, E_other, observed_E))

# 估计的参数
estimated_params = result.x

# 计算预测值
predicted_E = estimated_params[0] + estimated_params[1] * np.exp(estimated_params[2] * E_traditional) + \
               estimated_params[3] * np.log(estimated_params[4] * E_renewable + 1) + \
               estimated_params[5] * np.power(E_other, estimated_params[6])

# 计算决定系数
r_squared = r2_score(observed_E, predicted_E)

# 绘制残差图
residuals = observed_E - predicted_E
plt.scatter(observed_E, residuals)
plt.title('Residuals Plot')
plt.xlabel('Observed E')
plt.ylabel('Residuals')
plt.show()

# 正态性检验(例如,使用Shapiro-Wilk检验)
from scipy.stats import shapiro
stat, p_value = shapiro(residuals)
print(f'Shapiro-Wilk Test - Statistic: {stat}, p-value: {p_value}')

matlab示例代码如下:

rng(42);
time_points = 1:100;
E_traditional = rand(1, 100) * 50;
E_renewable = rand(1, 100) * 30;
E_other = rand(1, 100) * 20;
observed_E = 5 + 2 * exp(0.1 * E_traditional) + 1.5 * log(0.5 * E_renewable + 1) + 0.5 * power(E_other, 0.7) + normrnd(0, 5, 1, 100);

% 定义非线性模型
nonlinear_model = @(params, x) params(1) + params(2) * exp(params(3) * x(:, 1)) + ...
                                    params(4) * log(params(5) * x(:, 2) + 1) + ...
                                    params(6) * power(x(:, 3), params(7));

% 初始参数估计值
initial_params = ones(1, 7);

% 优化参数
estimated_params = lsqcurvefit(nonlinear_model, initial_params, [E_traditional', E_renewable', E_other'], observed_E);

% 计算预测值
predicted_E = nonlinear_model(estimated_params, [E_traditional', E_renewable', E_other']);

% 计算决定系数
r_squared = 1 - sum((observed_E - predicted_E).^2) / sum((observed_E - mean(observed_E)).^2);

% 绘制残差图
residuals = observed_E - predicted_E;
scatter(observed_E, residuals);
title('Residuals Plot');
xlabel('Observed E');
ylabel('Residuals');

% 正态性检验(例如,使用Shapiro-Wilk检验)
[h, p_value, stat] = swtest(residuals);
fprintf('Shapiro-Wilk Test - Statistic: %.4f, p-value: %.4f\n', stat, p_value);

查看更多详细思路可以关注公众号【Unicorn建模】,里面会持续更新完善思路!!

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值