【问题标题】:fit with lsqcurvefit does not work maybe function maldefined适合 lsqcurvefit 不起作用可能是函数错误定义
【发布时间】:2014-06-19 05:37:48
【问题描述】:

我正在尝试将函数 F 拟合到实验数据。 x_tem 和 yd 都是大小为 (12,1) 的向量。该功能应该找到最好的 函数的拟合值 y_tau 与实验数据。 我只是找不到错误 - matlab 向我显示错误:

Error in lsqcurvefit (line 199)
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

原因: 初始用户提供的目标函数评估失败。 LSQCURVEFIT 无法继续。

代码是:

x_tem=Temp_aero_korrektur(:,1);
yd=Temp_aero_korrektur(:,2);

F = @(y_tau,x_tem)((-1)*((273.15-x_tem)*(273.15-y_tau(1))*8.314*    (((17.62*x_tem)/(243.12+x_tem))-((17.62*y_tau(1))/(243.12+y_tau(1)))))/(40714.53)); 

yd_tau = lsqcurvefit(F,-40,x_tem,yd);

【问题讨论】:

    标签: matlab function definition


    【解决方案1】:

    这里有两种可能性。一个是您确实想在目标函数中使用矩阵运算(例如,x_tem/x_tem 使用mrdivide 给出单个标量值)。如果是这种情况,那么您应该使用 x_tem 的转置调用 lsqcurvefit

    yd_tau = lsqcurvefit(F,-40,x_tem',yd);
    

    另一种选择是,您实际上是要根据 x_tem 的每个值计算目标函数(例如,使用 x_tem./x_tem 给出与 x_tem 长度相同的向量)。如果是这种情况,那么您的目标函数应该是

    F = @(y_tau,x_tem)((-1)*((273.15-x_tem).*(273.15-y_tau(1)).*8.314.*    (((17.62*x_tem)./(243.12+x_tem))-((17.62*y_tau(1))/(243.12+y_tau(1)))))/(40714.53))
    

    (有关逐元素操作,请参阅 timesrdivide 的文档)

    【讨论】:

    • 我做了第二种可能的方式,现在我得到了以下提示:Local minimum possible。 lsqcurvefit 停止是因为平方和相对于其初始值的最终变化小于函数容差的默认值。 优化停止,因为相对平方和 (r) 的变化小于 options.TolFun = 1.000000e-06。优化指标选项相对变化 r = 8.95e-09 TolFun = 1e-06(默认)我需要移动最小值吗?
    • 或者我必须使用另一个拟合函数作为 lsqcurvefit 吗??
    • 您收到的消息并不一定意味着有问题。该算法无法确定它是否找到了“正确”的解决方案。您可以为 y_tau 尝试不同的起始值,看看是否会得到不同的结果。如果您可以访问Multistart (lsqcurvefit example),它可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多