You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改面向实验数据的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:27:01