目录

前言

一、MATLAB如何求解非线性方程组

二、稳态漂移求解例子        

总结

前言

        本文使用vpasolve求解基于车辆单轨动力学模型的漂移平衡态研究,针对使用vpasolve函数求数值解时可能少解的问题,提出了解决办法,并进行存放解的矩阵格式美化,消除了全零行(空解)以及重复行,并对漂移平衡态进行研究分析。

一、MATLAB如何求解非线性方程组

        MATLAB可以通过多种方法求解方程组,最简单的两个函数就是solve和vpasolve,其中solve多用于对线性方程组求解符号解,vpasolve用于对非线性方程组,在无法获得符号解的情况下,通过迭代求解出近似的数值解
        求取数值解时,就会出现因为精度不同、初值不同而可能无解,或者少解。针对这种情况,本文通过随机取初值,多次求解的方法来尽量避免出现少解的情况。
        vpasolve函数使用模板如下:
        vpasolve(eqns,vars);其中eqns即为要求变量的方程组,vars为变量。之后再添加'Random',true,可以让该函数初值随机,即每次运行可能得到不同的解。若不添加,则每次运行结果都一样,可能出现少解的情况。因此可以循环运行多次,观察是否有多解。

%定义方程中的变量
syms u2 x2 x3

eqns1= (fFy+fRy)/(m*x1)-x3 ==0;
eqns2= (fFy*lf-fRy*lr)/Iz ==0;
eqns3= (u2-fFy*sin(u1))/m+x1*x2*x3== 0;
eqns = [eqns1,eqns2,eqns3];
%变量矩阵
vars = [u2 x2 x3];                               

%让初值随机,从而避免永远收敛到一个解
[solu2, solx2,solx3] = vpasolve(eqns, vars,'Random',true);  

 %精确到小数点后四位 
u2=vpa(solu2,4);                           
x2=vpa(solx2,4);
x3=vpa(solx3,4);


       

二、稳态漂移求解例子        

1.单次求解
        本文例子为基于如下模型,求解当车辆侧滑角、航向角速度、速度都不变时的稳态漂移状态。通过固定车辆纵向速度,改变前轮转向角,求解出车辆稳态状态量。
稳态漂移方程:

求解代码如下:

function [fRx,beta,r] = SSdrift_solve(x1,u1)
%固定x1,u1求x2,x3,u2,即固定纵向速度,和前轮转向角,去求侧滑角、航向角速度、后轮驱动力
%    SSdrift_solve(1.2,10*pi/180)   

%  车辆参数
m = 1.95;          % kg
Iz = 0.24;         % kg / m^2
lf = 0.125;          % m
lr = 0.125;         % m

BF=7.4;CF=1.25;
BR=7.4;CR=1.25;
u=0.23;Fz=10;
%定义状态量[Ux,beta,r]=[x1,x2,x3]
syms u2 x2 x3;                                     

%计算轮胎侧滑角和侧向力
aF=atan(x2+(lf*x3)/x1)-u1;
aR=atan(x2-(lr*x3)/x1);

fFy=-1*u*Fz*sin(CF*atan(BF*aF));
fRy=-sqrt((u*Fz)^2-u2^2)*sign(aR);

%稳态转弯方程组

eqns1= (fFy+fRy)/(m*x1)-x3 ==0;
eqns2= (fFy*lf-fRy*lr)/Iz ==0;
eqns3= (u2-fFy*sin(u1))/m+x1*x2*x3== 0;
eqns = [eqns1,eqns2,eqns3];
%变量
vars = [u2 x2 x3];                               
%[solu2, solx2,solx3] = vpasolve(eqns, vars,'Random',true);
%可以让初值随机,从而避免永远收敛到一个解
[solu2, solx2,solx3] = vpasolve(eqns, vars,'Random',true);             %进行求解,'Random',true
 %精确到小数点后四位 
u2=vpa(solu2,4);                           
x2=vpa(solx2,4);
x3=vpa(solx3,4);

fRx = u2;
beta = x2;
r = x3;

end

2.多次求解并绘图
部分代码如下:

rand_num=50;
Ux=1.2;
%% 获取轮胎力饱和时的解
    %初始化暂时存储解的矩阵data_fmax
    data_fmax=zeros(rand_num,5);
    for j=1:rand_num
        %获取解
        [fRx,beta,r]=SSdrift_solve(Ux,-20*pi/180);
        %判断此时是否无解,避免出现“无法执行赋值,因为左侧的大小为 1×1,右侧的大小为 0×1”的报错
        if fRx~=0 & beta~0 & r~=0
            data_fmax(j,1)=fRx;
            data_fmax(j,2)=beta;
            data_fmax(j,3)=r;
        end
    end

    %data_fmax进行格式处理
    %去掉data_fmax中的全零行
    data_fmax (all(data_fmax == 0, 2),:) = [];
    %去掉data_fmax中的重复行
    data_fmax= unique(data_fmax,'rows');


通过随机取初值求解50次,基本能避免出现少解的情况,若花费时间过长,可以适当减小;

 

结果如下,最终方程可以获得两个解。

 

3.稳态漂移求解最终结果图


        可以看到,固定纵向速度后,保持不同的转向角,车辆会有两种运动状态。
        一种是正常的转弯状态,此时轮胎横向力未饱和,侧滑角小,后轮驱动力小。航向角速度和转向角近似成线性正相关。
        另一种则是漂移的状态,此时轮胎横向力接近饱和,且有大侧滑角,并需要较大的后轮驱动力来保持漂移状态。此时随着转向角速度变化,航向角速度变化小,而后轮驱动力变化较大。


总结

        以上就是今天要讲的内容,本文介绍了vpasolve的使用,及少解的一种解决办法。并基于此进行车轮转弯稳态的求解,分析了车辆漂移状态和正常转弯状态。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐