如何将信赖域算法和常规最小二乘法结合起来代替cftool中的拟合

在使用matlab做非线性拟合时,需要用到cftool工具箱进行非线性拟合,在工具箱中用的算法是信赖域算法和常规最小二乘法,现在我想在代码中使用信赖域算法和常规最小二乘法直接实现非线性拟合而不调用cftool。
目前只能实现常规的最小二乘法或者是信赖域算法,请教各位,如何将这两者结合起来或者是如何在程序中取代cftool中的非线性拟合?

  • 这篇博客: 数学建模4 拟合算法中的 3、通过cftool matlab自带的拟合工具箱来进行数据拟合 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在窗口中输入cftool,打开拟合工具箱。
    评价拟合模型的好坏:
    主要
    1.看指数平方和:SSE的值越小越好。
    2.拟合的简洁性原则。就是尽量保证拟合的函数简洁更好。

    具体过程如图:
    在这里插入图片描述
    界面说明
    在这里插入图片描述
    例题2:已知30个数据点,横坐标x由(0,10)之间的随机数,纵坐标服从,在这里插入图片描述
    代码

    clear;clc 
    x = rand(30,1) * 10;
    y = 3 * exp(0.5*x) -5 + normrnd(0,1,30,1);
    cftool
    

    在这里插入图片描述
    图上所示:设置x data(横坐标数据源)为x ,Y data(纵坐标数据源)为Y,设置拟合函数为指数形式,且为1次函数。此时误差平方和SSE:243.7 对应的函数形式为f(x)=2.434exp(0.521X)
    通过调节函数形式得到不同的函数
    当设置函数为指数,一元二次函数形式
    在这里插入图片描述
    SSE为:27.28,相比一元一次函数,一元二次函数的误差更小,且原函数也为指数函数。则选择此函数形式

    f(x)=3.232exp(0.4933x)-4.851*exp(0.0628x)

    总结:
    函数选择原则:
    当散点图走势是直线,优先选线性拟合,评价指标为SSE和R平方,SSE越小越好,R平方越大越好。
    其他的函数选择条件是SSE越小越好,且不是线性拟合时不能用R平方来评价。
    其他:函数形式应当越简单越好。

以下回答参考GPT并且由妙妙大帅整理:
Matlab中可以使用lsqcurvefit函数实现常规的最小二乘法拟合,使用lsqnonlin函数实现信赖域算法拟合。下面是一个使用lsqcurvefit实现非线性拟合的例子:


% 首先定义拟合函数
fun = @(x,xdata) x(1)*exp(-x(2)*xdata) + x(3)*exp(-x(4)*xdata);

% 然后定义xdata和ydata
xdata = [0:0.1:1]';
ydata = 2*exp(-3*xdata) + 3*exp(-5*xdata) + randn(size(xdata))*0.1;

% 给出初始参数估计
x0 = [1, 1, 1, 1];

% 调用lsqcurvefit进行非线性拟合
x = lsqcurvefit(fun, x0, xdata, ydata);

% 绘制拟合结果
yfit = fun(x, xdata);
plot(xdata, ydata, 'ro', xdata, yfit, 'b-');

上述代码中,fun是要拟合的函数,xdata和ydata是数据点,x0是初始参数估计,lsqcurvefit返回的x是拟合得到的参数。

使用lsqnonlin实现信赖域算法拟合的代码如下:

% 首先定义误差函数
fun = @(x) 2*exp(-3*x(1)) + 3*exp(-5*x(1)) - x(2);

% 给出初始参数估计
x0 = [0];

% 调用lsqnonlin进行非线性拟合
x = lsqnonlin(fun, x0);

% 绘制拟合结果
xdata = [0:0.1:1]';
ydata = 2*exp(-3*xdata) + 3*exp(-5*xdata) + randn(size(xdata))*0.1;
yfit = 2*exp(-3*x) + 3*exp(-5*x);
plot(xdata, ydata, 'ro', xdata, yfit, 'b-');

上述代码中,fun是误差函数,x0是初始参数估计,lsqnonlin返回的x是拟合得到的参数。

需要注意的是,拟合的成功与否很大程度上取决于初始参数估计的准确性。在使用信赖域算法时,还需要指定算法的一些参数,比如最大迭代次数等,需要根据具体问题来调整。