可能重叠的曲线之间的插值
Interpolation between curves that may overlap
我尝试使用 matlab(和 interp1 函数)在一些已经存在的曲线的间隙中插入曲线。
编辑开始 1
我已经有了 5 条扭矩随 rpm 曲线的数据,这些数据是我通过对每条曲线的多次模拟获得的。由于模拟时间很宝贵,我想通过在现有曲线之间插入 "fill the gap" 曲线来节省时间。
我希望形成以下内容:
下面是我的进一步想法。
编辑 1 结束
我尝试按照线程 Interpolation between two curves (matlab) 中问题的步骤进行操作,但它似乎不适用于我的代码。我不确定该代码是否实际适用,因为曲线 可能 重叠...
我尝试编辑上面 link 中的代码,如下所示:
% Save the data in one array each. The original data is stored in the
% arrays "x/yOriginal" row-wise.
curve1_data = [xOriginal(:,1) yOriginal(:,1)];
curve2_data = [xOriginal(:,2) yOriginal(:,2)];
% This was to try if the code from the link works
yy = [0:1:60];
xx1 = interp1(curve1_data(:,2),curve1_data(:,1),yy,'spline');
xx2 = interp1(curve2_data(:,2),curve2_data(:,1),yy,'spline');
m = 3; % Curve_Offset
mm(:,m) = xx1 + (xx2-xx1)*(m/(8750-5000));
% With the following I tried to interpolate over x
xx = (xOriginal(1,1):1:xOriginal(1,2));
yy1 = interp1(curve1_data(:,1),curve1_data(:,2),xx,'spline');
yy2 = interp1(curve2_data(:,1),curve2_data(:,2),xx,'spline');
m = 3; % Curve_Offset
% From the original code:
mm(:,m) = xx1 + (xx2-xx1)*(m/(8750-5000));
% Interpolation over x
yINT = yy1 + (yy2-yy1)*(m/8750-5000);
None 的插值技术有效,y 值要么是 90% 负值(使用 link 中的代码)要么太高(10e8 对 x 进行插值) .
我期望的是它创建的曲线比曲线 "to its left" 稍微缓和一点,比曲线 "to its right".
陡一点
我的进一步想法:
现有曲线是大型三维数组的产物。 IE。可能更多的方法是对数组进行插值,然后 然后 "read out" 转矩随转速变化曲线。另一方面,我看不到在两个 1001×7001×5 数组之间进行插值的方法...
此外,对于程序的后续步骤,曲线插值需要非常精细(两条现有曲线之间必须有超过 1 条插值曲线),这使得问题更加困难。
如果我没理解错的话,剧情是这样生成的:
plot(xOriginal(:,1),yOriginal(:,1))
plot(xOriginal(:,2),yOriginal(:,2))
% ...
如果是这样,您可以用
绘制一条中间曲线
plot((xOriginal(:,1) + xOriginal(:,2))/2, (yOriginal(:,1) + yOriginal(:,2))/2)
即每对坐标之间的平均值形成一条恰好在两条原始曲线之间half-way的曲线。
使用加权平均值生成更多此类曲线。这是线性插值。
d = 0.2;
plot(d*xOriginal(:,1) + (1-d)*xOriginal(:,2), d*yOriginal(:,1) + (1-d)*yOriginal(:,2))
设置d = 0.5
我们回到上面的half-way案例。
示例:
xOriginal(:,1) = linspace(0.2,0.5,100);
yOriginal(:,1) = 3 * cos(xOriginal(:,1)*10-2.5) + 3;
xOriginal(:,2) = linspace(0.6,0.8,100);
yOriginal(:,2) = cos(xOriginal(:,2)*20-13.5) + 1;
clf; hold on
plot(xOriginal(:,1),yOriginal(:,1))
plot(xOriginal(:,2),yOriginal(:,2))
plot((xOriginal(:,1)+xOriginal(:,2))/2,(yOriginal(:,1)+yOriginal(:,2))/2)
(内插线为橙色)
我尝试使用 matlab(和 interp1 函数)在一些已经存在的曲线的间隙中插入曲线。
编辑开始 1
我已经有了 5 条扭矩随 rpm 曲线的数据,这些数据是我通过对每条曲线的多次模拟获得的。由于模拟时间很宝贵,我想通过在现有曲线之间插入 "fill the gap" 曲线来节省时间。
我希望形成以下内容:
下面是我的进一步想法。
编辑 1 结束
我尝试按照线程 Interpolation between two curves (matlab) 中问题的步骤进行操作,但它似乎不适用于我的代码。我不确定该代码是否实际适用,因为曲线 可能 重叠...
我尝试编辑上面 link 中的代码,如下所示:
% Save the data in one array each. The original data is stored in the
% arrays "x/yOriginal" row-wise.
curve1_data = [xOriginal(:,1) yOriginal(:,1)];
curve2_data = [xOriginal(:,2) yOriginal(:,2)];
% This was to try if the code from the link works
yy = [0:1:60];
xx1 = interp1(curve1_data(:,2),curve1_data(:,1),yy,'spline');
xx2 = interp1(curve2_data(:,2),curve2_data(:,1),yy,'spline');
m = 3; % Curve_Offset
mm(:,m) = xx1 + (xx2-xx1)*(m/(8750-5000));
% With the following I tried to interpolate over x
xx = (xOriginal(1,1):1:xOriginal(1,2));
yy1 = interp1(curve1_data(:,1),curve1_data(:,2),xx,'spline');
yy2 = interp1(curve2_data(:,1),curve2_data(:,2),xx,'spline');
m = 3; % Curve_Offset
% From the original code:
mm(:,m) = xx1 + (xx2-xx1)*(m/(8750-5000));
% Interpolation over x
yINT = yy1 + (yy2-yy1)*(m/8750-5000);
None 的插值技术有效,y 值要么是 90% 负值(使用 link 中的代码)要么太高(10e8 对 x 进行插值) .
我期望的是它创建的曲线比曲线 "to its left" 稍微缓和一点,比曲线 "to its right".
陡一点我的进一步想法:
现有曲线是大型三维数组的产物。 IE。可能更多的方法是对数组进行插值,然后 然后 "read out" 转矩随转速变化曲线。另一方面,我看不到在两个 1001×7001×5 数组之间进行插值的方法... 此外,对于程序的后续步骤,曲线插值需要非常精细(两条现有曲线之间必须有超过 1 条插值曲线),这使得问题更加困难。
如果我没理解错的话,剧情是这样生成的:
plot(xOriginal(:,1),yOriginal(:,1))
plot(xOriginal(:,2),yOriginal(:,2))
% ...
如果是这样,您可以用
绘制一条中间曲线plot((xOriginal(:,1) + xOriginal(:,2))/2, (yOriginal(:,1) + yOriginal(:,2))/2)
即每对坐标之间的平均值形成一条恰好在两条原始曲线之间half-way的曲线。
使用加权平均值生成更多此类曲线。这是线性插值。
d = 0.2;
plot(d*xOriginal(:,1) + (1-d)*xOriginal(:,2), d*yOriginal(:,1) + (1-d)*yOriginal(:,2))
设置d = 0.5
我们回到上面的half-way案例。
示例:
xOriginal(:,1) = linspace(0.2,0.5,100);
yOriginal(:,1) = 3 * cos(xOriginal(:,1)*10-2.5) + 3;
xOriginal(:,2) = linspace(0.6,0.8,100);
yOriginal(:,2) = cos(xOriginal(:,2)*20-13.5) + 1;
clf; hold on
plot(xOriginal(:,1),yOriginal(:,1))
plot(xOriginal(:,2),yOriginal(:,2))
plot((xOriginal(:,1)+xOriginal(:,2))/2,(yOriginal(:,1)+yOriginal(:,2))/2)
(内插线为橙色)