如何修改面向实验数据的MATLAB非线性函数拟合脚本 可不用lsqcurvefit
Matlab非线性最小二乘拟合代码修正方案
原代码存在的核心问题
- 变量名大小写混用、拼写错误:比如
Sample和sample、linespace应为linspace、interpl应为interp1、lsqscurvefit应为lsqcurvefit,文件路径用了中文引号 - 滥用
global全局变量,不符合lsqcurvefit的函数入参规范 - 没有正确定义待拟合的模型函数,
lsqcurvefit要求第一个入参是匿名函数/函数句柄,输入为待拟合参数向量和自变量 - 拟合逻辑混乱:你需要拟合的是
coefficient1/2/3即x、y、z三个参数,自变量为T,不是把T作为待拟合量 - 原代码中定义的A3未被引入最终计算逻辑,若需要可自行添加到模型函数中
修正后的完整实现代码
不需要拆分3个独立脚本,合并后的代码同时提供两种拟合方案,适配有无Optimization Toolbox的场景:
% --------------- 1. 导入并预处理实验数据 --------------- Sample = readmatrix('experimentaldata'); T_exp = Sample(1,:)'; % 实验自变量T的实测值 Y_exp = Sample(2,:)'; % 实验因变量的实测值 % --------------- 2. 定义拟合模型函数 --------------- % 待拟合参数为p(1)=x, p(2)=y, p(3)=z,自变量为T model_fun = @(p, T) (p(1)*0.321.*T + 0.3) .* (p(2)/0.2 + 0.5.*T) + 0.3; % --------------- 3. 设置拟合初始值与参数边界 --------------- p0 = [1,1,1]; % 三个待拟合参数的初始猜测值,可根据参数实际范围调整,避免陷入局部最优 lb = []; % 参数下界,无限制可留空 ub = []; % 参数上界,无限制可留空 % --------------- 4. 执行拟合 --------------- % 方案1:使用lsqcurvefit(需Optimization Toolbox) p_fit = lsqcurvefit(model_fun, p0, T_exp, Y_exp, lb, ub); % 方案2:不用lsqcurvefit,用fminsearch实现卡方/最小二乘拟合(无工具箱依赖,通用性更强) % chi2_fun = @(p) sum( (model_fun(p, T_exp) - Y_exp).^2 ); % 定义残差平方和目标函数 % p_fit = fminsearch(chi2_fun, p0); % --------------- 5. 输出结果与可视化 --------------- disp('拟合得到的三个系数分别为:'); disp(['x = ', num2str(p_fit(1))]); disp(['y = ', num2str(p_fit(2))]); disp(['z = ', num2str(p_fit(3))]); % 绘制拟合效果对比 T_plot = linspace(min(T_exp), max(T_exp), 2000); Y_fit_plot = model_fun(p_fit, T_plot); plot(T_exp, Y_exp, 'ro', 'DisplayName', '实验实测数据'); hold on; plot(T_plot, Y_fit_plot, 'b-', 'LineWidth', 1.5, 'DisplayName', '拟合曲线'); legend; xlabel('T'); ylabel('因变量');
内容的提问来源于stack exchange,提问作者Manu Han
相关产品推荐
相关产品推荐

