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
从均值为2的指数分布的100个独立样本。生成的代码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“旋风”)%的再现性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(5,841), (x,res)“旋风”)%的再现性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