ppp546 发表于 2009-6-3 16:14:35

如果用M代码提取穿越次数呢?

如图所示,是一个二阶振荡曲线,在Workspace有两个一维向量,tout<4000*1>,yout<4000*1>,其中第399个值是0.9999,第400个值是1.0002,第401个值为1.003,我有什么办法能提取出来穿越1的次数呢?

iwbm 发表于 2009-6-3 16:21:21

遍历 每两个相邻的数,看是否包含1?

xiezhh 发表于 2009-6-3 23:01:12

我写一个例子,振荡曲线方程为:
y = 1-0.5*x.*cos(2*pi*x);
运行下面代码求穿过直线y=1的次数和交点
x=linspace(-8,0,4000);
y1 = 1-0.5*x.*cos(2*pi*x);
y2 = ones(size(y1));
y1_y2 = diff((y1-y2)>=0);
id = find(y1_y2);
cross_num = length(id)%穿越次数
plot(x,y1,'r')
hold on
%求交点
xcross = [];
ycross = [];
if ~isempty(id)
    fenmu = y2(id)-y2(id+1)+y1(id+1)-y1(id);
    xcross = (x(id+1).*(y2(id)-y1(id))+x(id).*(y1(id+1)-y2(id+1)))./fenmu;
    ycross = (y1(id+1).*y2(id)-y1(id).*y2(id+1))./fenmu;
end

plot(xcross, ycross, 'o')

效果图如下

ppp546 发表于 2009-6-4 17:21:41

我也写了一个代码,可能运行效率没有楼上的高
for i=1:(length(y1)-1)
        if y1(i)<1
                if y1(i)(i+1)>=1
                        N=N+1;
                end;
        end;
end;
N=N/2;

ppp546 发表于 2009-6-4 17:22:08

谢谢xiezhh

xiezhh 发表于 2009-6-4 20:47:34

我觉得用matlab求曲线交点的时候,最正常的思路就是解方程,若求解析解,很可能出现无解,若求数值解,又跟初值的选取有很大关系。以前也有很多求曲线交点,线面交点的讨论,比如《工程计算可视化与MATLAB实现》(尚涛编著)里有很多现成的程序,那里的做法基本都是设定一个误差,让差的绝对值小于这个误差来求交点,对有些情况,结果很不精确。
      我的思路也是先将曲线数据离散化(变成等长的向量),然后确定两条曲线互穿的位置(即下标),就可以在两条曲线上分别找到相邻的两个点,从而确定两条直线,求这两条直线的交点即可得两条曲线的交点,运算都是基于向量化运算,避免了循环。当然这种作法求出的交点也会有一定误差,但是从图上看不出来,即使一直放大图像,我想原因大家应该能够明白。

ppp546 发表于 2009-6-5 09:04:34

我明白xiezhh 的意思,通过等长离散化就可以求出曲线交战数值,而且也不需要编程。只要采样点足够多,就可保证交点解的准确性。
谢谢!
页: [1]
查看完整版本: 如果用M代码提取穿越次数呢?