【数据拟合】人口增长模型拟合、分数阶扩散方程求解、常微分方程数值解附matlab代码

【数据拟合】人口增长模型拟合、分数阶扩散方程求解、常微分方程数值解附matlab代码
✅作者简介热爱科研的Matlab仿真开发者擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 往期回顾关注个人主页Matlab科研工作室 关注我领取海量matlab电子书和数学建模资料个人信条格物致知,完整Matlab代码获取及仿真咨询内容私信。 内容介绍这段 Matlab 代码包含了多个功能模块主要围绕人口增长模型拟合、分数阶扩散方程求解、常微分方程数值解等方面展开。下面对各部分进行详细分析1. 人口增长模型拟合数据准备定义了年份year和对应的人口数量population。模型定义经典指数增长模型classical_model基于初始人口和增长率来预测不同时间的人口数量。分数模型fractional_model使用 Mittag - Leffler 函数通过mlf近似来构建更复杂的人口增长模型该模型有两个参数。初始猜测与优化为经典模型和分数模型分别设置了不同的初始猜测值。使用lsqcurvefit函数对模型进行参数优化通过最小化模型预测值与实际人口数据的误差平方和来确定最优参数。绘图与结果展示绘制实际人口数据以及不同初始猜测下经典模型和分数模型的拟合曲线。展示每个模型在不同初始猜测下的优化参数、误差并计算分数模型相对于经典模型的效率提升。绘制了一个放大的子图展示特定区域内模型与数据的拟合细节。2. 分数阶扩散方程求解solve_fractional_diffusion函数功能求解分数阶扩散方程。步骤生成时间和空间网格初始化解矩阵U计算空间算子矩阵A通过时间步长迭代求解方程。在每一步中计算系数b和a_vec得到过去部分P_j_int和源项f_j_int求解线性系统得到当前时间步的解并更新U。compute_two_mesh_difference函数功能计算粗网格和细网格解之间的最大差异用于评估数值解的收敛性。步骤检查网格尺寸是否符合要求遍历粗网格点在细网格中找到最近点计算并记录最大差异。主脚本部分定义参数并调用solve_fractional_diffusion函数求解分数阶扩散方程绘制解的三维表面图。针对不同的r值和网格尺寸M_list计算并展示两网格差异D和收敛阶数p以评估数值方法的性能。3. 基于精确解的时间分数阶 PDE 求解检测与求解检查是否定义了精确解u_exact。如果存在精确解运行solgiven.m计算误差否则运行gradedmesh.m使用两网格差异法。通用求解器针对不同的分数阶alpha_values和空间 / 时间分辨率N_values求解时间分数阶 PDE。定义源项f_j_int预计算 L1 权重b通过时间步长迭代求解方程并计算与精确解的误差和收敛率最后展示结果。4. 常微分方程数值解欧拉方法定义与求解定义常微分方程ode和初始条件cond使用dsolve求解得到精确解并转换为可数值评估的函数actual_solution。使用欧拉方法对常微分方程进行数值求解在不同的子区间数量N下计算近似解。结果展示与分析展示x值、欧拉方法的近似解和精确解。绘制近似解和精确解的对比图。计算不同N值下的误差并通过误差计算欧拉方法的收敛阶数最后显示执行时间。⛳️ 运行结果 部分代码% Data providedyear [1910, 1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990, 2000, 2010];population [1750, 1860, 2070, 2300, 2520, 3020, 3700, 4440, 5270, 5980, 6790];​% Start timetic;​% Classical exponential growth modelclassical_model (P, t) population(1) * exp(P * (t - year(1)));​% Mittag-Leffler function (approximation)mlf (alpha, z) arrayfun((z) sum(z.^(0:100) ./ gamma(alpha * (0:100) 1)), z);​% Fractional modelfractional_model (params, t) population(1) * mlf(params(1), params(2) * (t - year(1)).^params(1));​% Different initial guessesinitial_guesses_classical [0.005, 0.01, 0.015];initial_guesses_fractional [1.2, 0.003; 1.3, 0.002; 1.5 ,0.01];​​t_fit linspace(min(year), max(year), 1000);figure;hold on;plot(year, population, -x, DisplayName, Data);​​% Preallocate storageerrors_classical zeros(length(initial_guesses_classical), 1);errors_fractional zeros(size(initial_guesses_fractional, 1), 1);optimized_P_classical zeros(length(initial_guesses_classical), 1);optimized_params_fractional zeros(size(initial_guesses_fractional, 1), 2);​​% Loop over different initial guesses for classical modelfor i 1:length(initial_guesses_classical)P0_classical initial_guesses_classical(i);P_classical lsqcurvefit(classical_model, P0_classical, year, population);N_classical classical_model(P_classical, t_fit);% Store optimized parameter and erroroptimized_P_classical(i) P_classical;errors_classical(i) sum((population - classical_model(P_classical, year)).^2);​% Plot classical modelplot(t_fit, N_classical, DisplayName, sprintf(Classical (P0%.3f, P%.6f), P0_classical, P_classical));end​​% Loop over different initial guesses for fractional modelfor j 1:size(initial_guesses_fractional, 1)params0_fractional initial_guesses_fractional(j, :);params_fractional lsqcurvefit(fractional_model, params0_fractional, year, population);N_fractional fractional_model(params_fractional, t_fit);% Store optimized parameters and erroroptimized_params_fractional(j, :) params_fractional;errors_fractional(j) sum((population - fractional_model(params_fractional, year)).^2);​% Plot fractional modelplot(t_fit, N_fractional, --, DisplayName, ...sprintf(Frac (α0%.1f, P0%.3f, α%.3f, P%.6f), ...params0_fractional(1), params0_fractional(2), params_fractional(1), params_fractional(2)));end​xlabel(Year);ylabel(Population);legend;title(Comparison of Classical and Fractional Growth Models);grid on;hold off;​​inset_axes axes(Position, [0.64 0.2 0.25 0.25]); % [x, y, width, height]box on; hold on; grid on;​% Define zoomed-in limitsxlim_range [1927.04275 1927.04295];ylim_range [2016.39874 2016.39876];​% Plot data points inside the insetplot(inset_axes, year, population, -x, DisplayName, Data);​% Replot all models inside the zoomed-in insetfor i 1:length(initial_guesses_classical)plot(inset_axes, t_fit, classical_model(optimized_P_classical(i), t_fit), LineWidth, 1);endfor j 1:size(initial_guesses_fractional, 1)plot(inset_axes, t_fit, fractional_model(optimized_params_fractional(j, :), t_fit), --, LineWidth, 1);end​% Adjust inset plot propertiesxlim(inset_axes, xlim_range);ylim(inset_axes, ylim_range);title(inset_axes, Zoomed View);xlabel(inset_axes, Year);ylabel(inset_axes, Population);​​% Stop timestop_time toc;fprintf(Execution time: %f seconds\n, stop_time);​fprintf(\nErrors and Efficiency Gains:\n\n);​​for i 1:length(initial_guesses_classical)fprintf(Classical (P0%.3f) Error: %f, Optimized P: %.9f\n, ...initial_guesses_classical(i), errors_classical(i), optimized_P_classical(i));end​for j 1:size(initial_guesses_fractional, 1)fprintf(Fractional (α0%.1f, P0%.3f) Error: %f, Optimized α: %.7f, Optimized P: %.15f\n, ...initial_guesses_fractional(j, 1), initial_guesses_fractional(j, 2), ...errors_fractional(j), optimized_params_fractional(j, 1), optimized_params_fractional(j, 2));% Calculate efficiency gainif j length(errors_classical)efficiency_gain abs(errors_classical(j) - errors_fractional(j)) / abs(errors_classical(j));fprintf(Efficiency Gain: %.6f (%.2f%% improvement)\n, efficiency_gain, efficiency_gain * 100);end​end​ 参考文献往期回顾扫扫下方二维码