【问题标题】:fitting a complex function in matlab using "lsqcurvefit"使用“lsqcurvefit”在matlab中拟合复杂函数
【发布时间】:2013-03-19 00:07:20
【问题描述】:

我有一个复杂的函数,我想拟合一些真实数据。函数形式为:

Y = -2*imag((A-B)/(A+2*B)) ....................(1)

在哪里

“imag”表示方程的虚部
A = a - (b/X)*1i ....................(2)
B = c - (d/X)*1i .. ...................(3)

Y 有虚部和实部。但这是与我的问题相关的虚构部分。如何通过将方程(1)拟合到实际实验数据来推导 a、b、c 和 d 的值?我曾尝试使用“lsqcurvefit”,但它一直返回我输入的相同起始值!我确信我一定错过了一些重要的事情。

请尽可能简化您的答案,因为我还是 MATLAB 的新手。

谢谢。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    要在您的函数上运行 lsqcurvefit,您可以首先创建一个名为 f.m 的文件,其中包含:

    function Y = f(params,X)
    
    a = params(1);
    b = params(2);
    c = params(3);
    d = params(4);
    
    A = a - ((b ./ X) .* 1i);
    B = c - ((d ./ X) .* 1i);
    
    Y = 2 .* imag((A - B)./(A + 2*B));
    

    然后为此函数调用 lsqcurvefit 并绘制结果:

    startParams = [1, 2, 3, 4];
    x = 1:100;
    y = f(startParams, x);
    fitParams = lsqcurvefit(@f, startParams+1, x, y)
    
    yFit = f(fitParams, x);
    plot(x, y, 'b*')
    hold on
    plot(X, yFit, 'r')
    legend('data','fit')
    

    【讨论】:

    • 我将您的样本调整为真实数据和一个新函数:function F = f1(params,xdata) a = params(1); % e_mem b = 参数(2); % s_mem c = 参数(3); % e_int d = 参数(4); % s_int em = 80*8.854e-12; D = 6e-9; r =5e-6; sm = 5.6e-2; R = ((r+D)/r); E_mem = a - (b*1i)./(2*pixdata); % 复数 E_mem E_int = c - (d*1i)./(2*pixdata); % 复数 E_int E_m = em - (sm*1i)./(2*pi*xdata); % 复数 E_m E_p = (R^3 + 2*(E_int - E_mem)./(E_int + 2*E_mem))./(R^3 - (E_int - E_mem)./(E_int + 2*E_mem)); % 复数 E_p F = -7.59e-8*imag((E_p-E_m)./(E_p+2*E_m));结束
    • 然后我运行求解器。但是即使我改变了它们,我也得到了相同的起始值。问题出在哪里? startParams = [8.2e-5, 7.79e-10, 4.42e-10, 0.1]; xdata = [1e4;1.8e4;3.00e4;5.50e4;1e5;1.8e5;3.1e5;5.5e5;1e6;1.8e6;3e6;5.5e6;1e7;1.8e7;3e7;5.5e7;1e8]; ydata= 0.81*([-0.15;-0.25;-0.41;-0.72;-1.1;-1.35;-1.3;-1;-0.61;-0.35;-0.2;0;0.01;0.35;0.55;0.78;0.8 ]); fitParams = lsqcurvefit(@f1, startParams, xdata, ydata) yFit = f1(fitParams, xdata); semilogx(xdata, ydata, 'b*') 保留 semilogx(xdata, yFit, 'r') 图例('data','fit')。 % 谢谢
    • 起始参数是否合适?如果您从偏离的参数开始怎么办?看看残差。您可以在 Options 输入参数中更改 MaxIter、MaxFunEvals、TolX 和 TolFun,以使 lsqcurvefit 寻找不同的结果。我现在没有它在我面前。 (如果有帮助,请考虑接受答案!:)
    • 谢谢莫莉。我会试试你的建议。
    • 好的,我看了一下。您需要更接近实际值的起始参数。
    猜你喜欢
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2019-05-10
    • 2023-04-04
    • 2014-03-29
    • 2013-06-16
    相关资源
    最近更新 更多