生成的代码lsqcurvefit
或lsqnonlin
这个例子展示了如何为非线性最小二乘生成C代码。
最小二乘数据和模型
在这个例子中,向量xdata
代表100数据点,和向量ydata
代表相关的测量。模型之间的关系xdata
和ydata
是
生成的数据问题。
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);
代码生成方法
使用代码生成来解决同样的问题,完成以下步骤。
写一个函数,它包含了所有前面的步骤:生成数据,创建一个合适的函数,创建一个初始点,电话
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,磅,乌兰巴托,选项);结束
创建一个配置代码生成。在这种情况下,使用
墨西哥人的
。cfg = coder.config (墨西哥人的);
生成的代码
solvelsqcurve
函数。codegen配置cfgsolvelsqcurve
通过运行生成的测试生成的代码文件,命名
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);
代码生成方法
使用代码生成来解决同样的问题,完成以下步骤。
写一个函数,它包含了所有前面的步骤:生成数据,创建一个合适的函数,创建一个初始点,电话
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、磅、乌兰巴托、选项);结束
创建一个配置代码生成。在这种情况下,使用
墨西哥人的
。cfg = coder.config (墨西哥人的);
生成的代码
solvelsqnon
函数。codegen配置cfgsolvelsqnon
通过运行生成的测试生成的代码文件,命名
solvelsqnon_mex.mexw64
或类似的。[x, res] = solvelsqnon_mex
x = 1.0169 3.1444 2.1596 res = 7.4101
生成的一个解决方案是相同的
solvelsqcurve_mex
解决,因为有相同的基本算法。所以,你可以使用你找到最方便的解决者。
另请参阅
lsqcurvefit
|lsqnonlin
|codegen
(MATLAB编码器)|optimoptions