MATLAB曲线相减

问题

现有两条曲线( x ⃗ 1 \vec x1 x 1, y ⃗ 1 \vec y1 y 1),( x ⃗ 2 \vec x2 x 2, y ⃗ 2 \vec y2 y 2),两条曲线的坐标不一定对齐,点数不一定相同,即 x ⃗ 1 ≠ x ⃗ 2 \vec x1\neq \vec x2 x 1=x 2,现要求两条曲线的差值。

要计算下面两个曲线的差值

x1 = 0:0.5:2*pi;
y1 = sin(x1);
x2 = 0:0.45:2.5*pi;
y2 = cos(x2);

plot(x1,y1,':o');
hold on
plot(x2,y2,':*');

在这里插入图片描述

解决方法

在网上找了一圈,没找到相关的函数,自己写了一个函数

% 求y1-y2的差值
function [x,y] = CurveSubtraction(x1,y1,x2,y2)
fprintf('the length of x1 and x2 is:[%d] and [%d]\n',length(x1),length(x2));

% 排序
[x1,index] = sort(x1);
y1 = y1(index);
[x2,index] = sort(x2);
y2 = y2(index);

% 删除重复元素
[x1,ia] = unique(x1);
y1 = y1(ia);
[x2,ia] = unique(x2);
y2 = y2(ia);

min_x = max(min(x1),min(x2)); %求出横坐标的公共部分
max_x = min(max(x1),max(x2));

x1_cut_index = find(x1>=min_x&x1<=max_x); %裁剪到起点和终点后的坐标索引
x2_cut_index = find(x2>=min_x&x2<=max_x);
len_x1 = length(x1_cut_index); %裁剪之后的向量长度
len_x2 = length(x2_cut_index);
fprintf('the range of common subsequence:[%d-%d]. x1 has [%d] elements,x2 has [%d] elements\n',min_x,max_x,len_x1,len_x2)
x1_cut = x1(x1_cut_index); % 裁剪到相同起点和终点后的横纵坐标
y1_cut = y1(x1_cut_index);
x2_cut = x2(x2_cut_index);
y2_cut = y2(x2_cut_index);

if len_x1>len_x2 %如果y1点数多余y2点数,把y2插值到和y1一样多,然后相减
    inter_y2 = interp1(x2_cut,y2_cut,x1_cut);
    x = x1_cut;
    y = y1_cut - inter_y2;
    fprintf('Interpolating y2');
else % 否则,把y1插值到和y2一样多,然后相减
    inter_y1 = interp1(x1_cut,y1_cut,x2_cut);
    x = x2_cut;
    y = inter_y1 - y2_cut;
    fprintf('Interpolating y2');
end
end

测试

x1 = 0:0.5:2*pi;
y1 = sin(x1);
x2 = 0:0.45:2.5*pi;
y2 = cos(x2);

plot(x1,y1,':o');
hold on
plot(x2,y2,':*');
%% 
[x,y] = CurveSubtraction(x1,y1,x2,y2);
hold on
plot(x,y,'-^');
line([0 8],[0 0]);
legend('y1','y2','y1-y1')

在这里插入图片描述

  • 17
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值