依据Carsim中导出的Tor=G(spd,Thr)二维表数据,制作Thr=F(spd,Tor)二维表,灵感来自B站up忠厚老实的老王。
其中:Tor为发动机转矩(Engine torque),spd发动机转速(Engine,speed),Thr为节气门开度(Throttle).
主要思路:将原二维数组重整,即spd、Thr、Tor三个变量的关系一一对应,将其分别放入三个行向量中,最后,利用matlab自带的scatteredInterpolant进行散点插值,从而得出Thr=F(spd,Tor)二维表。完整代码如下:
%% 读取数据
filename = '125KWengine.xls';
sheet = 1;
xlRange = 'A1:K23';
data = xlsread(filename,sheet,xlRange);
%% 手动取出有效数据
[r,c]=size(data);
spd=data(4:r,1)';
thr=data(1,2:c);
torque_table=data(4:r,2:c);
[r1,c1]=size(torque_table);
%% 将数据转成行向量
%参数:
% x_thr 节气门行向量,维度:1*(r1*c1)
% y_spd 转速行向量,维度:1*(r1*c1)
% z_tor 转矩行向量,维度:1*(r1*c1)
z_tor=torque_table(:,1)';
for i=2:c1
z_tor=cat(2,z_tor,torque_table(:,i)');
end
y_spd=kron(ones(1,c1),spd);
thr_temp=kron(ones(r1,1),thr);
x_thr=thr_temp(:,1)';
for j=2:c1
x_thr=cat(2,x_thr,thr_temp(:,j)');
end
%% 散点插值 得出 x_thr=F(y_spd,z_tor);
F=scatteredInterpolant(y_spd',z_tor',x_thr','linear');
% F=scatteredInterpolant(x_thr',y_spd',z_tor','nearest');
% surf(x_thr',y_spd',F(x_thr',y_spd'));
%% 新表制作
%spd使用原数据
%Torque依据原数据扭矩值最大最小值,重新给出
Torque=-60:10:250;
Throttle=zeros(length(spd),length(Torque));
for i=1:length(spd)
for j=1:length(Torque)
Throttle(i,j)=F(spd(i),Torque(j));
%Throttle(i,j)=griddata(y_spd',z_tor',x_thr',spd(i),Torque(j),'natural');
end
end
%% 后续处理
% 将Throttle二位数组中,大于1的元素置1,小于零的元素置0
index1=find(Throttle<0);
Throttle(index1)=0;
index2=find(Throttle>1);
Throttle(index2)=1;
outdata=cell(2);
outdata{1,1}=0;
outdata{1,2}=Torque;
outdata{2,1}=spd';
outdata{2,2}=Throttle;
outdata=cell2mat(outdata);
surf(Torque,spd,Throttle);
补充一下二位数组重组思路:
导入的数据为carsim中125kw的发动机数据,第一行为节气门,第一列为发动机转速,表中其余数据为发动机转矩。我在代码里将扭矩前两行为零的数据剔除了(这样做结果会好一些)。
最终结果:
本文章主要是提供一种思路,具体效果如何自行判断吧。
水平有限,第一次写稿,如有问题欢迎交流。