chenjc18 发表于 2009-1-5 16:56

针对含有两(及以上)个零的 离散序列 计算零点算法

针对ChaChing 兄 对上述程序提出的见解
我将问题暂时解决了一下:
请看程序:
此程序只是使用于含有两个零(及以上)的离散序列,对于含有1个或者连续出现两个零点的情形 可以按照我提出的 分段求解 思路 对下面的程序稍加修改 即可使用。

请大家,试试看,还有什么问题。
鉴于我刚刚学习MATLAB,其中出现幼稚的语句也在所难免,还请大家多提出建议。谢谢了clear;close;

y=;
x=linspace(0,20,length(y));
zero=zeros(length(x),1);
x=x';
y=y';
plot(x,y,'b',x,zero,'r');
ind=find(y==0);
X1=x(ind); %找到自身就有的零点对应的x
%段一 从段首到第一个自身的零点
%以下是对段一求解零点
a=y(1:(ind(1)-1));
b=find(a(1:end-1).*a(2:end)<0);
c=;
d=;
for k=1:length(b)
X2(k)=interp1(,,0);
end
%中间的各段
clear a b c d ;
for i=1:(length(ind)-1)
if((ind(i+1)-ind(i)~=1)|(ind(i+1)-ind(i)~=2))
a=y((ind(i)+1):(ind(i+1)-1));
a1=x((ind(i)+1):(ind(i+1)-1));
b=find(a(1:end-1).*a(2:end)<0);
c=;
d=;
for k=1:length(b)
X_3(i,k)=interp1(,,0);
end
else continue;
end
end
X_30=reshape(X_3,1,[]); %矩阵转向量;
X3=X_30(find(X_30)); %剔除系统自动补的零
%最后一段,最后一个自身的零点 到 y序列末
clear a b c d a1;
a=y((ind(length(ind))+1):length(y));
a1=x((ind(length(ind))+1):length(y));
b=find(a(1:end-1).*a(2:end)<0);
c=;
d=;
X=zeros(size(b));
for k=1:length(b)
X4(k)=interp1(,,0);
end
X_1=cat(2,X1',X2);
X_2=cat(2,X3,X4);
X=cat(2,X_1,X_2);
X=sort(X) %按升序排列 得到零点序列


[ 本帖最后由 chenjc18 于 2009-1-5 21:36 编辑 ]

ChaChing 发表于 2009-1-5 21:43

回复 16楼 chenjc18 的帖子

楼主了解涵义了! 人不适, 明天再看看!

chenjc18 发表于 2009-1-5 23:02

可以处理任意离散序列的程序

我将16楼的做了改到 可以处理任何形式的离散序列:适用于:不含零点 含有一个零点 含有两个(不)连续零点 含有两个以上零点
请大家,看一下程序,有什么问题
谢谢了
我写的这段程序可能有点太乱了,嘿嘿,我已经尽力 欢迎大家批评指正,大家共同进步!

clear;close;
y=;
x=linspace(0,20,length(y));
zero=zeros(length(x),1);
x=x';
y=y';
plot(x,y,'b',x,zero,'r');
ind=find(y==0); %找出自身零点所在下标
if(isempty(ind)) %如果原离散序列不含有零,则进行程序一
%%%%%%%%程序一%%%%%%%%%
    b=find(y(1:end-1).*y(2:end)<0);
    c=;
    d=;
    for k=1:length(b)
      X(k)=interp1(,,0);
    end
    X %输出x
else%否则执行程序二
%%%%%%%%%程序二%%%%%%%%%%%
X1=x(ind);   %找到自身就有的零点对应的x
%%段一 从段首到第一个自身的零点
a=y(1:(ind(1)-1));
b=find(a(1:end-1).*a(2:end)<0);
c=;
d=;
X=zeros(size(b));
for k=1:length(b)
X2(k)=interp1(,,0);
end
%中间的各段
clear a b c d ;
if((length(ind)==2)&(ind(2)-ind(1)==1)|(length(ind)==1))
    X_3=;%如果原离散序列含有一个,或者连续两个零点,则执行此句
else      %如果含有两个(不连续)及以上个零点 执行下面的语句
for i=1:(length(ind)-1)
    if((ind(i+1)-ind(i)~=1)|(ind(i+1)-ind(i)~=2))%如果出现相邻的或间隔为1的零点,则跳过
      a=y((ind(i)+1):(ind(i+1)-1));            
      a1=x((ind(i)+1):(ind(i+1)-1));
      b=find(a(1:end-1).*a(2:end)<0);
      c=;
      d=;
      for k=1:length(b)
      X_3(i,k)=interp1(,,0);
      end
    else continue;
    end
end
end
X_30=reshape(X_3,1,[]); %矩阵转向量;
X3=X_30(find(X_30));    %剔除系统自行添加的零
%%最后一段,最后一个自身的零点 到 y序列末
clear a b c d a1;
a=y((ind(length(ind))+1):length(y));
a1=x((ind(length(ind))+1):length(y));
b=find(a(1:end-1).*a(2:end)<0);
c=;
d=;
for k=1:length(b)
X4(k)=interp1(,,0);
end
%%将各段计算得出零点放在一起
X_1=cat(2,X1',X2);      
X_2=cat(2,X3,X4);
X=cat(2,X_1,X_2);
X=sort(X)                %按升序排列
end

ch_j1985 发表于 2009-1-5 23:11

回复 18楼 chenjc18 的帖子

LZ还真有研究的劲头,佩服!

ChaChing 发表于 2009-1-6 16:02

真服了楼主的态度! 欣赏!
还记得7F的回覆吗!? 其中说过interp1好像根本不需要!
18F的程序太长了, 逻辑思绪个人感觉太复杂了, 有点懒得看, 不好意思!
欣赏楼主, 列上我的, 不是最佳, 参考参考!
clc; clear;
y=;
x=linspace(0,20,length(y)); x=x'; y=y'; xx=[]; plot(x,y); grid on;
for k=1:length(y)-1
   if y(k)==0, xx=;
   elseif y(k)*y(k+1)<0, xx=; end
end
if y(end)==0, xx=; end
xx

其中x(k)-y(k)*(x(k+1)-x(k))/(y(k+1)-y(k))亦可用interp1(,,0)

[ 本帖最后由 ChaChing 于 2009-1-6 16:09 编辑 ]

chenjc18 发表于 2009-1-6 21:07

回复 20楼 ChaChing 的帖子

谢谢 ChaChing
您编写的程序真棒!
又长了很多知识,谢谢了
页: 1 [2]
查看完整版本: 在 由离散点绘制的曲线上 找出零点对应的横坐标