应用模糊控制,悬架加速度和速度作为输入,主动悬架作动力是输出
程序上还有不少问题,最终悬架位移在白噪声的作用下竟然没有收敛,水平实在有限,希望有相关研究的小伙伴可以指正。
导入相关库
import numpy as np import skfuzzy as fuzz import skfuzzy.control as ctrl import matplotlib.pyplot as plt from math import cos as cos
n0, n1, gq, u = 0.1, 0.01, 256.*10**(-6), 25. l1 = 2 * 3.14 * n0 * (gq * u) ** (1 / 2) l2 = 2 * 3.14 * n1 * u Aa, La = 0.1, 1. x_dzs_range=np.arange(-3,3,1,np.float32) x_ddzs_range=np.arange(-3,3,1,np.float32) y_fa_range=np.arange(-30,30,1,np.float32) # 创建模糊控制变量 x_dzs=ctrl.Antecedent(x_dzs_range, 'dzs') x_ddzs=ctrl.Antecedent(x_ddzs_range, 'ddzs') y_fa=ctrl.Consequent(y_fa_range, 'fa')
定义模糊集和其隶属度函数
x_dzs['NB']=fuzz.zmf(x_dzs_range, -3, -1) x_dzs['NM']=fuzz.trimf(x_dzs_range,[-3,-2,0]) x_dzs['NS']=fuzz.trimf(x_dzs_range,[-3,-1,1]) x_dzs['ZO']=fuzz.trimf(x_dzs_range,[-2,0,2]) x_dzs['PS']=fuzz.trimf(x_dzs_range,[-1,1,3]) x_dzs['PM']=fuzz.trimf(x_dzs_range,[0,2,3]) x_dzs['PB']=fuzz.smf(x_dzs_range,1,3) x_ddzs['NB']=fuzz.zmf(x_ddzs_range,-3,-1) x_ddzs['NM']=fuzz.trimf(x_ddzs_range,[-3,-2,0]) x_ddzs['NS']=fuzz.trimf(x_ddzs_range,[-3,-1,1]) x_ddzs['ZO']=fuzz.trimf(x_ddzs_range,[-2,0,2]) x_ddzs['PS']=fuzz.trimf(x_ddzs_range,[-1,1,3]) x_ddzs['PM']=fuzz.trimf(x_ddzs_range,[0,2,3]) x_ddzs['PB']=fuzz.smf(x_ddzs_range,1,3) y_fa['NB']=fuzz.zmf(y_fa_range,-30,30) y_fa['NM']=fuzz.trimf(y_fa_range,[-30,-20,0]) y_fa['NS']=fuzz.trimf(y_fa_range,[-30,-10,10]) y_fa['ZO']=fuzz.trimf(y_fa_range,[-20,0,20]) y_fa['PS']=fuzz.trimf(y_fa_range,[-10,10,30]) y_fa['PM']=fuzz.trimf(y_fa_range,[0,20,30]) y_fa['PB']=fuzz.smf(y_fa_range,10,30) # 设定输出powder的解模糊方法——质心解模糊方式 y_fa.defuzzify_method='centroid'
制定规则
rule1=ctrl.Rule(antecedent=((x_dzs['PM'] & x_ddzs['PS'])|(x_dzs['PM'] & x_ddzs['PM'])|(x_dzs['PM'] & x_ddzs['PB'])|(x_dzs['PB'] & x_ddzs['ZO'])|(x_dzs['PB']&x_ddzs['PS'])|(x_dzs['PB'] & x_ddzs['PM'])|(x_dzs['PB'] & x_ddzs['PB'])),consequent=y_fa['NB']) rule2=ctrl.Rule(antecedent=((x_dzs['ZO'] & x_ddzs['PM'])|(x_dzs['ZO'] & x_ddzs['PB'])|(x_dzs['PM'] & x_ddzs['NS'])|(x_dzs['PM'] & x_ddzs['ZO'])|(x_dzs['PB']&x_ddzs['NS'])),consequent=y_fa['NM']) rule3=ctrl.Rule(antecedent=((x_dzs['NS'] & x_ddzs['PM'])|(x_dzs['NS'] & x_ddzs['PB'])|(x_dzs['ZO'] & x_ddzs['PS'])|(x_dzs['PS'] & x_ddzs['ZO'])|(x_dzs['PS']&x_ddzs['PS'])|(x_dzs['PS'] & x_ddzs['PM'])|(x_dzs['PS'] & x_ddzs['PB'])),consequent=y_fa['NS']) rule4=ctrl.Rule(antecedent=((x_dzs['NB'] & x_ddzs['PM'])|(x_dzs['NB'] & x_ddzs['PB'])|(x_dzs['NM'] & x_ddzs['PB'])|(x_dzs['NM'] & x_ddzs['PM'])|(x_dzs['NS']&x_ddzs['PS'])|(x_dzs['ZO'] & x_ddzs['ZO'])|(x_dzs['PS'] & x_ddzs['NS'])|(x_dzs['PM'] & x_ddzs['NB'])|(x_dzs['PM'] & x_ddzs['NM'])|(x_dzs['PB'] & x_ddzs['NB'])|(x_dzs['PB'] & x_ddzs['NM'])),consequent=y_fa['ZO']) rule5=ctrl.Rule(antecedent=((x_dzs['ZO'] & x_ddzs['NS'])|(x_dzs['PS'] & x_ddzs['NB'])|(x_dzs['PS'] & x_ddzs['NM'])),consequent=y_fa['PS']) rule6=ctrl.Rule(antecedent=((x_dzs['NB'] & x_ddzs['PS'])|(x_dzs['NM'] & x_ddzs['ZO'])|(x_dzs['NM'] & x_ddzs['PS'])|(x_dzs['NS'] & x_ddzs['NB'])|(x_dzs['NS']&x_ddzs['NM'])|(x_dzs['NS'] & x_ddzs['NS'])|(x_dzs['NS'] & x_ddzs['ZO'])|(x_dzs['ZO'] & x_ddzs['NB'])|(x_dzs['ZO'] & x_ddzs['NM'])),consequent=y_fa['PM']) rule7=ctrl.Rule(antecedent=((x_dzs['NB'] & x_ddzs['NB'])|(x_dzs['NB'] & x_ddzs['NM'])|(x_dzs['NB'] & x_ddzs['NS'])|(x_dzs['NB'] & x_ddzs['ZO'])|(x_dzs['NM']&x_ddzs['NB'])|(x_dzs['NM'] & x_ddzs['NM'])|(x_dzs['NM'] & x_ddzs['NS'])),consequent=y_fa['PB'])
# 构建系统 system = ctrl.ControlSystem(rules=[rule1, rule2, rule3, rule4, rule5, rule6, rule7]) sim = ctrl.ControlSystemSimulation(system)
在中间一个时间段添加高斯白噪声
t = [i * 0.01 for i in range(1000)] x = [i for i in range(1000)] # x :原始信号 # snr 信噪比 def wgn(x,snr): snr=10 ** (snr/10.) xsum=0 for i ,d in enumerate(x): xsum = xsum + abs(d)**2 xpower=xsum / len(x) npower=xpower / snr l=len(x) a=np.random.randn(l)*np.sqrt(npower) a=np.array(a) a=a.reshape([l,1]) return a y = wgn(np.array(x),500).tolist()
设置路面干扰输入
zr = [0.] dzr = [0.] for i in range(1, 1000): dzr.append(l1 * y[i][0] - l2 * zr[i-1]) if i < 300 and i > 300 + 100 * La / u: zr.append(zr[i-1] + 0.01 * dzr[-1]) else: zr.append(Aa/2 * (1-cos(2 * 3.14 * u /La * (i* 0.01 - 3))))
用1/4悬架模型迭代,具体模型可以去网上搜搜比如这个博客
zs, zu, dzs, dzu, ddzs, ddzu = [0], [0], [0], [0], [0], [0] ms, mu, ks, cs, kt = 1000., 125., 45000., 2350., 650000. lan1, lan2, lan3 = 20., 10., 1. fa = [] for i in range(1, 1000): vz = lan2 * dzs[i-1] az = lan3 * ddzs[i-1] sim.input['dzs'] = vz sim.input['ddzs'] = az sim.compute() fa.append(sim.output['fa']) ddzs.append(1 / ms * (cs * dzu[i-1]-dzs[i-1] + ks * (zu[i-1]-zs[i-1])+fa[-1])) dzs.append(dzs[i-1] + ddzs[i] * 0.01) zs.append(zs[i-1] + dzs[i] * 0.01) ddzu.append(1 / mu * (-cs * (dzu[i-1]-dzs[i-1]) - ks * (zu[i-1]-zs[i-1])-fa[-1] + kt * (zr[i-1]-zu[i-1]))) dzu.append(dzu[i-1] + ddzu[i] * 0.01) zu.append(zu[i-1] + dzu[i]*0.01)
下图是悬架速度与时间的关系,发现用这种方法并不收敛。。。。
下图是悬架加速度与时间的关系,也不收敛。。。。