主要内容

生成的代码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从均值为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);

代码生成方法

要使用代码生成解决相同的问题,请完成以下步骤。

  1. 编写一个包含前面所有步骤的函数:生成数据、创建拟合函数、创建初始点和调用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,磅,乌兰巴托,选项);结束
  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(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、磅、乌兰巴托、选项);结束
  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编码器)|

相关的话题