3

悬架模糊控制 - 静候佳茵

 1 year ago
source link: https://www.cnblogs.com/hitwherznchjy/p/16353003.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

悬架模糊控制

应用模糊控制,悬架加速度和速度作为输入,主动悬架作动力是输出

程序上还有不少问题,最终悬架位移在白噪声的作用下竟然没有收敛,水平实在有限,希望有相关研究的小伙伴可以指正。

导入相关库



er-hljs

import numpy as np import skfuzzy as fuzz import skfuzzy.control as ctrl import matplotlib.pyplot as plt from math import cos as cos



er-hljs

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')

定义模糊集和其隶属度函数



er-hljs

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'



er-hljs

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'])



er-hljs

# 构建系统 system = ctrl.ControlSystem(rules=[rule1, rule2, rule3, rule4, rule5, rule6, rule7]) sim = ctrl.ControlSystemSimulation(system)

在中间一个时间段添加高斯白噪声



er-hljs

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()

设置路面干扰输入



er-hljs

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悬架模型迭代,具体模型可以去网上搜搜比如这个博客



er-hljs

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)

下图是悬架速度与时间的关系,发现用这种方法并不收敛。。。。

2014676-20220607185825349-1051385629.png

下图是悬架加速度与时间的关系,也不收敛。。。。

2014676-20220607190006664-1320466449.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK