我正在尝试使用 nlinfit
拟合曲线,但是,我有3个未知数。
我想要拟合的等式是管中的层流速度分布。
u = umax( 1 - ( r / R ) ^ 2 )
,其中u
是速度,umax
是中心线速度,r
是距中心线的距离R
1}}是管的半径。
问题在于umax
,r
和R
是未知数。
http://www.mne.psu.edu/cimbala/learning/fluid/CV_Momentum/pipe_eg.gif
从上图中,中心线是轴。我已经包含了一组数据的代码:
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 );
我很感激任何试图填写这些数据的帮助。谢谢你的时间。
答案 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')
我得到的最佳参数是
par_fit =
0.1940 -0.4826 9.0916
您可能需要再次旋转绘图以使其朝向正确的方向,如草图中那样。
由于可以分析地计算该流动剖面,因此事先知道它是抛物线。您也可以使用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--'