具有多个未知数的MATLAB nlinfit

时间:2014-10-30 19:14:38

标签: matlab curve-fitting

我正在尝试使用 nlinfit 拟合曲线,但是,我有3个未知数。

我想要拟合的等式是管中的层流速度分布。

u = umax( 1 - ( r / R ) ^ 2 ) ,其中u是速度,umax是中心线速度,r是距中心线的距离R 1}}是管的半径。

问题在于umaxrR是未知数。

http://www.mne.psu.edu/cimbala/learning/fluid/CV_Momentum/pipe_eg.gif enter image description here

从上图中,中心线是轴。我已经包含了一组数据的代码:

clc
clear all

XMean = [0.13518 
0.1599
0.17035
0.18053
0.18849
0.19577
0.19373
0.18781
0.17245
0.15728
0.13404
0.10981];

r = [-5.5000
   -4.5000
   -3.5000
   -2.5000
   -1.5000
   -0.5000
    0.5000
    1.5000
    2.5000
    3.5000
    4.5000
    5.5000];

plot( XMean, r )

我不知道如何格式化方程式句柄:

Eqn = @(u,y) u(1).*( 1 - ( ( u(2) - y ) / u(3) ).^2 );

[ beta, R, J, CovB, MSE ] = nlinfit( YMean, r, Eqn, Alpha );

我很感激任何试图填写这些数据的帮助。谢谢你的时间。

1 个答案:

答案 0 :(得分:3)

为了计算rmse,每个x值的最大值为1 y是必要的,数学上说是“函数”。您可以稍后以草图显示的方式进行绘图。但是对于计算:旋转90度。

对于优化,您需要一个初始猜测(您的Alpha),这是未定义的。但是,通过下面代码中的一些细微更改,可以获得最佳参数。它也可能更好阅读。情节如下所示。

plot(r, XMean ,'ko', 'markerfacecolor', 'black') % // need a "function" (max 1y value for 1x-value)
Eqn = @(par, x) par(1).*( 1 - ( (par(2) - x) / par(3) ).^2 );
par0 = [1, 1, 1]; % // an initial guess as start for optimization
par_fit = nlinfit(r, XMean, Eqn, par0 ); % // optimize
hold on
r_fit = linspace(min(r), max(r)); % // more points for smoother curve
plot(r_fit, Eqn(par_fit, r_fit), 'r')

enter image description here 我得到的最佳参数是

par_fit =

    0.1940   -0.4826    9.0916

您可能需要再次旋转绘图以使其朝向正确的方向,如草图中那样。

其他信息:polyfit()而不是nlinfit

由于可以分析地计算该流动剖面,因此事先知道它是抛物线。您也可以使用polyfit来拟合抛物线。

par_poly_fit = polyfit(r, XMean, 2)

% // it yields the values:
par_poly_fit =

-0.0023   -0.0023    0.1934

绘制paraobla给出的线与我们用优化器得到的线非常相同,但它更稳定,因为它不依赖于初始值。

 plot(r_fit, polyval(par_poly_fit, r_fit),'g--'