主要内容

生成的代码lsqcurvefitlsqnonlin

这个例子展示了如何为非线性最小二乘生成C代码。

最小二乘数据和模型

在这个例子中,向量xdata代表100数据点,和向量ydata代表相关的测量。模型之间的关系xdataydata

ydata = 一个 1 + 一个 2 经验值 ( 一个 3 xdata ) + ε

生成的数据问题。

rng (5489“旋风”)%的再现性xdata = 2 *日志(rand (100 1));ydata = ((100 1) + 1。* randn (100,1)) + (3 * 1 (100 1) +1)0.5 * randn (100)。* exp (((2 * (100 1) +0.5 * randn (100,1)))。* xdata);

生成的代码xdata从100年独立样本的指数分布的意思是2。生成的代码ydata从其定义方程使用= (1;3;2)通过添加与标准差偏离正常,摄动(0.1;0.5;0.5)

解决生成代码lsqcurvefit

解决方法

目标是寻找参数模型 一个 ^ ,= 1,2,3,最适合的数据。

使用合适的参数数据lsqcurvefit,您需要定义一个合适的函数。为lsqcurvefit,拟合函数接受一个参数向量一个和数据xdata并返回一个响应的预测,应该等于ydata没有噪音和一个完美的模型。定义了拟合函数预测作为一个匿名函数。

预测= @ (xdata) (1) * 1 (100 1) + (2) * exp (- a (3) * xdata);

适合的模型数据,lsqcurvefit需要一个初始估计a0的参数。

a0 = (2; 2; 2);

调用lsqcurvefit找到最佳拟合参数 一个 ^

[ahat, resnorm,残余,exitflag输出,λ,雅可比矩阵)=lsqcurvefit(预测、a0 xdata ydata);

代码生成方法

使用代码生成来解决同样的问题,完成以下步骤。

  1. 写一个函数,它包含了所有前面的步骤:生成数据,创建一个合适的函数,创建一个初始点,电话lsqcurvefit

    函数[x, res] = solvelsqcurve rng (5489,“旋风”)%的再现性xdata = 2 *日志(rand (100 1));ydata = ((100 1) + 1。* randn (100,1)) + (3 * 1 (100 1) +1)0.5 * randn (100)。* exp (((2 * (100 1) +0.5 * randn (100,1)))。* xdata);预测= @ (xdata) (1) * 1 (100 1) + (2) * exp (- a (3) * xdata);选择= optimoptions (“lsqcurvefit”,“算法”,“levenberg-marquardt”,“显示”,“关闭”);a0 = (2; 2; 2);磅= [];乌兰巴托= [];[x, res] = lsqcurvefit(预测、a0 xdata, ydata,磅,乌兰巴托,选项);结束
  2. 创建一个配置代码生成。在这种情况下,使用墨西哥人的

    cfg = coder.config (墨西哥人的);
  3. 生成的代码solvelsqcurve函数。

    codegen配置cfgsolvelsqcurve
  4. 通过运行生成的测试生成的代码文件,命名solvelsqcurve_mex.mexw64或类似的。

    [x, res] = solvelsqcurve_mex
    x = 1.0169 3.1444 2.1596 res = 7.4101

解决生成代码lsqnonlin

解决方法

目标是寻找参数模型 一个 ^ ,= 1,2,3,最适合的数据。

使用合适的参数数据lsqnonlin,您需要定义一个合适的函数。为lsqnonlin,拟合函数接受一个参数向量一个,数据xdata,数据ydata。拟合函数返回响应的预测和数据ydata,这应该等于0,没有噪音和一个完美的模型。定义了拟合函数预测作为一个匿名函数。

预测= @ (a) ((1) * (100 1) + (2) * exp (- a (3) * xdata) - ydata)

适合的模型数据,lsqnonlin需要一个初始估计a0的参数。

a0 = (2; 2; 2);

调用lsqnonlin找到最佳拟合参数 一个 ^

[ahat, resnorm,残余,exitflag输出,λ,雅可比矩阵)=lsqnonlin(预测、a0);

代码生成方法

使用代码生成来解决同样的问题,完成以下步骤。

  1. 写一个函数,它包含了所有前面的步骤:生成数据,创建一个合适的函数,创建一个初始点,电话lsqnonlin

    函数[x, res] = solvelsqnon rng (5489,“旋风”)%的再现性xdata = 2 *日志(rand (100 1));ydata = ((100 1) + 1。* randn (100,1)) + (3 * 1 (100 1) +1)0.5 * randn (100)。* exp (((2 * (100 1) +0.5 * randn (100,1)))。* xdata);预测= @ (a) ((1) * (100 1) + (2) * exp (- a (3) * xdata) - ydata);选择= optimoptions (“lsqnonlin”,“算法”,“levenberg-marquardt”,“显示”,“关闭”);a0 = (2; 2; 2);磅= [];乌兰巴托= [];[x, res] = lsqnonlin(预测、a0、磅、乌兰巴托、选项);结束
  2. 创建一个配置代码生成。在这种情况下,使用墨西哥人的

    cfg = coder.config (墨西哥人的);
  3. 生成的代码solvelsqnon函数。

    codegen配置cfgsolvelsqnon
  4. 通过运行生成的测试生成的代码文件,命名solvelsqnon_mex.mexw64或类似的。

    [x, res] = solvelsqnon_mex
    x = 1.0169 3.1444 2.1596 res = 7.4101

    生成的一个解决方案是相同的solvelsqcurve_mex解决,因为有相同的基本算法。所以,你可以使用你找到最方便的解决者。

另请参阅

||(MATLAB编码器)|

相关的话题