最小二乘法是一种数学优化技术,他通过最小化误差平方和寻找数据的最佳函数匹配,利用最小二乘法可以简便地求得未知数据,并使得这些数据与实际数据之间的误差平方和为最小,最小二乘法还可用于曲线拟合。在解决实际问题时最小二乘法也有着很多的用处。

一、基本原理

最小二乘法的一般提法为:已知 n 组观测数据(x1,y1),(x2,y2)...........(xn,yn), 可认为它们满足某一模型 y=g(x)+ε(x),其中 y=g(x)是函数 ,ε(x)=y-g(x)是观测值与函数值得误差,称为误差函数。 那么有 yi是观测值,εi=yi-g(xi)是观测误差。 设 g (x)是含有 p 个参数的拟合函数,则 ε(x)=y- g (x),εi=yi- g (xi),要确定 g (x)中 p 个参数的值,就要使得ni = 1Σεi2=ni = 1Σ(yi- g (xi))2达到最小。 这一方法称为最小二乘法。 特别的,假设拟合函数为:

y*=a1φ1(x)+a2φ2(x)+........asφs(x)

其中 φ1(x),φ2(x)............φs(x)为所选定的基函数,ai(i=1,2.....s)为待定系数,要确定系数 ai(i=1,2.....s),使得 y*与 n 组观测数据的距离的平方和尽可能小,也就是使得一下式子取最小值。

最小二乘法

利用距离的定义,也就是 |AX-B|^2,在 文献[1]中 证明了使得式(1)取最小值的 最小二乘法·,是方程 A′AX=A′B 的解,而方程 A′AX=A′B 总是有解,由此得到拟合函数:y*=a1φ1(x)+a2φ2(x)+........asφs(x). 

二、案例分析

这里将以2016年数学建模系泊系统的设计为例进行分析

最小二乘法

问题1  某型传输节点选用II型电焊锚链22.05m,选用的重物球的质量为1200kg。现将该型传输节点布放在水深18m、海床平坦、海水密度为1.025×103kg/m3的海域。若海水静止,分别计算海面风速为12m/s和24m/s时钢桶和各节钢管的倾斜角度、锚链形状、浮标的吃水深度和游动区域。

深度为H,h为吃水深度,则各结构体在竖直方向上的投影长度需满足:

最小二乘法

不同的h值所得出的海水深度与标准值之间会有不同的误差值,合理运用这个误差值就可以得出我们所需要的值。当误差值达到最小时,就可得到最合适的h值,即吃水深度,这一点可以通过求极值来实现,不过求极值时需要辨别一下精度是否是你需要的值。

运行程序:

function [depth_error,angle,alpha,theta_top,per_hight,len,sumx,X]=search(b,v)
%b吃水深度;v风速
rho_w=1.025e3; g=9.8;
rho_s=7.9e3;%钢铁密度
k=1-rho_w/rho_s;
M0=1000;%浮标质量
m_sphere=1200;
M=m_sphere*k;%M*g为重物球在水中的重力与浮力的合力
s=18;%锚链长度
t=[3.2 7 12.5 19.5 28.12];
th=t(5);
w=th*k*g;%锚链单位长度水中重力与浮力的合力,7为锚链单位长度的质量
v0=0;%v0即海水流速
%% 计算各部分合力
Fu=(rho_w*pi*b-M0)*g;%浮标重力与浮力的合力
Fw=0.625*2*(2-b)*v*v+374*2*b*v0^2;%浮标水平受力---风荷载即风力+水流力
%Fw=0.625*2*(2-b)*v*v;
F0=sqrt(Fu^2+Fw^2);the0=atan(Fw/Fu);%F0为浮标对第一节钢管的拉力,the0为该拉力与海平面的夹角
wind_p=Fw;flotage=Fu;
result_force=[[10,10,10,10]*k, 100-rho_w*pi*0.15^2, 7*0.105*k];%钢管非密封,result_force*g表示四节钢管、钢桶、锚链的重力与浮力的合力
admset=[0,0,0,0,M,0];
sm=pi*power((3*m_sphere/(4*pi*rho_s)),2/3);%重力球在竖直方向上的投影
s_hor=[0.05 0.05 0.05 0.05 0.3 sm];
F_hor=[];F_result=[];theta=[];
%% 对每个节点进行受力分析,由受力平衡得出拉力大小
for i=1:6
    newF_wind=wind_p;
    newF_reslut=flotage-result_force(i)*g-admset(i)*g;%浮标浮力-每一个重力单元重力与浮力的合力
    newthe=atan((newF_reslut-0.5*result_force(i)*g+admset(i)*g)/newF_wind);%每一个重力单元与水平面的夹角
    F_hor=[F_hor,newF_wind];%水平力
    F_result=[F_result,newF_reslut];%重力与浮力的合力
    theta=[theta,newthe];%夹角
    wind_p=newF_wind+ newthe*s_hor(i);
    flotage=newF_reslut;
end 
H0=wind_p;%风力
theta_top=theta(end);%锚链上端点倾角,theta_top
an_top=H0/w;%锚链顶端与竖直方向夹角的正切
alpha=atan(tan(theta_top)-s/an_top);%///***锚链与海床夹角***///
%% 计算竖直高度用最小二乘法求解吃水深度;
Y=(H0/w)*(cosh(asinh(tan(alpha)))-cosh(asinh(tan(theta_top))));
Y=-Y;
per_hight=[b,sin(theta(1:5)),Y];%每一段实物竖直方向上的高度
%% 计算水平距离确定活动范围
X=(H0/w)*(asinh(tan(theta_top))-asinh(tan(alpha)));
xs=[cos(theta(1:5)),X];%每一段实物水平方向上的长度
%%
sumz=sum(per_hight);sumx=sum(xs);
depth_error=(sumz-18)^2;%在这一步利用了最小二乘法的思想
if alpha<0
    len=tan(theta_top)*an_top;
else
    len=(tan(theta_top)-tan(alpha))*an_top;
end

%% 结果转化
angle=theta(1:5);
angle=90-180./(pi./angle);
alpha=180./(pi./alpha);
theta_top=180./(pi./theta_top);

函数调用:

clear;clc;
v=12;
b=fminbnd(@(b)search(b,v),0.5,2);%求解吃水深度

 

参考文献:

[1] 北京大学数学系几何与代数教研室代数小组 ,高 等代数[M].3 版.北京 :高等教育出版社,2003

[2] 刘佳. 最小二乘法基本思想及其应用[J]. 科技视界, 2016(22):186-187.

相关文章: