针对含有两(及以上)个零的 离散序列 计算零点算法
针对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 编辑 ]
回复 16楼 chenjc18 的帖子
楼主了解涵义了! 人不适, 明天再看看!可以处理任意离散序列的程序
我将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
回复 18楼 chenjc18 的帖子
LZ还真有研究的劲头,佩服! 真服了楼主的态度! 欣赏!还记得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 编辑 ]
回复 20楼 ChaChing 的帖子
谢谢 ChaChing您编写的程序真棒!
又长了很多知识,谢谢了
页:
1
[2]