【问题标题】:Fitting a function with lsqcurvefit用 lsqcurvefit 拟合函数
【发布时间】:2016-02-19 21:19:06
【问题描述】:

我使用 lsqcurvefit 来适应我的功能。 我的功能是:

C_PET (t)=(k_1/(α_2+α_1 ) [(k_3+k_4-α_1 )  e^((-α_1   t) )+(α_2-k_3-k_4 ) e^((-α_2   t) ) ]* C_P (t))+vC_b (t)

我去寻找解决方案,这意味着最适合我的 K 参数。 问题是我的代码给出的解决方案是起点。 这是代码(vb 是常数,cp,ydata,t 是向量

    k0 = 1*ones(1,4);
    k0(4) = 0;
    k0 = [0.8,0.1,0.5,0.07]
    a1=[k0(2)+k0(3)+k0(4)+sqrt(((k0(2)+k0(3)+k0(4)).^2) -4*k0(2)*k0(4))]/2;
    a2=[k0(2)+k0(3)+k0(4)-sqrt(((k0(2)+k0(3)+k0(4)).^2) -4*k0(2)*k0(4))]/2;
    l1=(k0(1)/(a2+a1))*(k0(3)+k0(4)-a1) l2=(a2-k0(3)-k0(4))
    l2=(a2-k0(3)-k0(4))
     y=conv((l1*exp(-a1*t)+l2*exp(-a2*t)),cp);

    y=(y(1:numel(t)));
    CPET=@(k,t) y+(vb*cp);
    [xfitted,errorfitted] = lsqcurvefit(CPET,k0,t,ydata)

%

所以请你帮帮我。

【问题讨论】:

    标签: matlab function function-fitting


    【解决方案1】:

    你的目标函数CPET是一个常数:

    CPET=@(k,t) y+(vb*cp);
    

    您已将其声明为 kt 的函数,但当 kt 更改时,yvbcp 都不会更改。这就是为什么您的求解器没有改变答案的原因。无论kt lsqcurvefit 的什么值反馈给CPET,答案总是一样的,这是错误的。

    您的目标函数很长,所以让我们考虑一个更简单的目标函数,比如拟合一个二次模型,该模型具有另一个函数 t 作为另一个术语(即与您的 C_P 工作方式相同),例如:

    O = k1 + k2*t + k3*t2 + CP(t)

    要将此目标函数写入lsqcurvefit 所期望的形式,请执行以下操作:

    O = @(k,t) k(1) + k(2).*t + k(3).*t.^2 + CP(t)
    

    现在上面的CP 可以是一个向量,CP,当且仅当t 总是一个自然数。然而,创建一个名为CP 的函数会更有意义,它将t 作为输入。例如,可能所有CP 所做的就是取t 的正弦然后

    CP = @(t)sin(t);  %// This needs to be declared before O
    

    您需要将您的CPET 类似函数写为kt 的函数,并且它需要在其定义中同时使用kt

    【讨论】:

    • 感谢您的回答,但我没有理解您的意思,我的函数 CPET 是一个向量而不是一个常数,并且方程中的 y 变化。我的 objectif 函数是用 CPET(t) 的公式编写的
    • 我是说如果你的CPET 函数是一个更简单的函数(在这种情况下是一个简单的二次函数),那么你就是这样编码的。它必须是 kt 的函数,因此您需要以与我在上面的答案中编写 O 函数相同的 MATLAB 形式重写 C_PET (t)=(k_1/(α_2+α_1 ) [(k_3+k_4-α_1 ) e^((-α_1 .... 函数。
    • 您的 CPET(t) 不是 MATLAB 语法。我看不出你的CPET=@(k,t) y+(vb*cp); 与它有什么关系。此外,lsqcurvefit 需要fun(x,xdata) 形式的函数。在您的情况下,xk,这是您要更改的参数向量,xdatat,是点向量。在每次迭代中,lsqcurvefit 将值传递给fun 并对其进行评估。如果fun 的值不依赖于xxdata,那么什么都不会改变(例如fun=@(x,xdata) 10),这基本上就是你目前正在做的事情
    • 谢谢你,我的函数依赖于k,t,α,cp和cb。所以为了方便编码,我一步一步地编写函数,当我在同一行中编写所有函数时,它给我一个卷积错误(矩阵尺寸必须一致。因为 y 的大小是 53,cp 的大小是 27 )
    • 拜托,我的函数 CPET 依赖于除 k 和 t 之外的其他参数,但我必须使用 matlab 函数,因为 CPET(t)= mynfction;你能告诉我我的错误到底在哪里.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2018-02-06
    相关资源
    最近更新 更多