【问题标题】:Matlab lsq curvefit parametersMatlab lsq曲线拟合参数
【发布时间】:2017-11-12 22:32:14
【问题描述】:

我在使用 matlab 的 lsqcurvefit 函数查找非线性拟合系数时遇到了一些问题。目前,我在运行代码时遇到索引超出矩阵尺寸错误。我的代码很简单,如下所示:

function aFit = fitTwoSlit(xData,yData)

load twoSlit
a0 = 4;+
aFit = lsqcurvefit(@TwoSlitInter,a0,xData,yData);
plot(xData, yData, 'bo', xData, aFit, 'k-');
end

function Inten = TwoSlitInter(a,x)


L = 1025.; % Length in mm
lambda_l = 6.7e-4; %laser lambda in mm
k_l = 9.378e+03;   % k for laser in 1/mm
phi = k_l*a(2)*sin(abs(x-a(4))/L);
psi = k_l*a(3)*sin(abs(x-a(4))/L);

Inten = a(1)*(sin(phi/2)./(phi/2)).^2.*(cos(psi/2)).^2;

end

我有一个数组“a”,其中包含强度函数使用的系数。如果 lsqcurvefit 需要传递函数句柄而不是函数本身,我对如何传递这些系数感到困惑。

任何帮助将不胜感激!

【问题讨论】:

  • lsqcurvefit 使用来自初始点 x0 的值来确定函数接受的变量的数量和大小。您没有传递向量a 中的系数。

标签: matlab


【解决方案1】:

为什么要在 fitTwoSlit 中加载数据,因为它们是函数的参数?如果我理解你的问题,我会期待类似的东西

load twoSlit; % this should load xData and yData

然后 aFit = fitTwoSlit(xData,yData);

a0 = 4; + 

假设 '+' 是一个错字,你会定义 a0 = 4。问题是你的 TwoSlitInter 函数需要一个 'a' 变量,它是一个四维向量(你指的是 a(1) 。 .. a(4).

所以假设你的 a 是

a0 = randn(4,1); % unlikely to be the best guess

那么你可以像在

中那样调用 lsqcurvefit
aFit = lsqcurvefit(@TwoSlitInter,a0,xData,yData);

然后要绘制结果,您需要类似

plot(xData, yData, 'bo', xData, TwoSlitInter(aFit, xData) , 'k-') ; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多