wh1125 发表于 2007-6-14 22:35

原帖由 yina_111 于 2007-6-7 09:31 发表 http://www.chinavib.com/forum/images/common/back.gif
已知一系列点的坐标,如何用matlab画点与点画连线,谢谢
你要把点连接起来,我倒感觉有时在一个区间的函数值分成几段,比如在[-6pi,6pi]区间微分方程解的曲线是三个独立的圆,但Matlab却把中间有没有值(即x在一定区间,y没有值)不该连的点用一条水平线连接起来了,要把那条线去掉,好麻烦,要把整个区间分成几段对端点处理一下才能分开成三个圆。我是这样干的,不知道有没有更好更简便的方法。
不知道我说清楚这个问题没,呵`·`:@D

无水1324 发表于 2007-6-15 08:48

回复 #16 wh1125 的帖子

完全没有看懂,没有意义的解是不会显示出来的。

咕噜噜 发表于 2007-6-15 09:35

回复 #16 wh1125 的帖子

没看明白,或许你有具体实例?

wh1125 发表于 2007-6-15 21:13

比如这个相图中,中间应该是没有那一条横线的(纵轴坐标为0那一条线)。我的方法是对横坐标分成几段,在几个端点位置把坐标特别处理了画出来的才会消失那条线,不过很麻烦。

程序如下(去掉了图中对图形标注的语句):

for H= %取这几个总能量值画相图(用能量法画的),就是相图里面一条曲线对应一个H值。
    theta0=-3*pi:0.001:3*pi; %theta0为大角度振动摆角范围
    theta1=sqrt(2*(H-1+cos(theta0))); %计算不同角度下的角速度theta1
plot(theta0,theta1) %绘制大角度振动的相图(上半部分)
axis 'equal'
hold on
plot(theta0,-theta1) %绘制大角度振动的相图(下半部分)
axis 'equal'
hold on
end

咕噜噜 发表于 2007-6-15 21:26

这个可能数学和编写程序之间理解存在误差的问题啊,改成这样就没有中间那条线了,就加了一个abs命令
for H= %取这几个总能量值画相图(用能量法画的),就是相图里面一条曲线对应一个H值。
    theta0=-3*pi:0.001:3*pi; %theta0为大角度振动摆角范围
    theta1=abs(sqrt(2*(H-1+cos(theta0)))); %计算不同角度下的角速度theta1
plot(theta0,theta1) %绘制大角度振动的相图(上半部分)
axis 'equal'
hold on
plot(theta0,-theta1) %绘制大角度振动的相图(下半部分)
axis 'equal'
hold on
end

[ 本帖最后由 咕噜噜 于 2007-6-15 21:30 编辑 ]

咕噜噜 发表于 2007-6-15 21:31

也有可能加上abs意义变了,不过记得我以前这么编过这个程序

gghhjj 发表于 2007-6-16 08:09

for H= %取这几个总能量值画相图(用能量法画的),就是相图里面一条曲线对应一个H值。
    theta0=-3*pi:0.001:3*pi; %theta0为大角度振动摆角范围
    theta1=sqrt(2*(H-1+cos(theta0))); %计算不同角度下的角速度theta1
    theta=;
    theta2=theta(real(theta(:,2))~=0,:);
plot(theta2(:,1),theta2(:,2),'.','MarkerSize',1) %绘制大角度振动的相图(上半部分)
axis 'equal'
hold on
plot(theta2(:,1),-theta2(:,2),'.','MarkerSize',1) %绘制大角度振动的相图(下半部分)
axis 'equal'
hold on
end

无水1324 发表于 2007-6-16 09:02

回复 #22 gghhjj 的帖子

谢谢!gghhjj
你太强了

wh1125 发表于 2007-6-16 21:45

原帖由 咕噜噜 于 2007-6-15 21:31 发表 http://www.chinavib.com/forum/images/common/back.gif
也有可能加上abs意义变了,不过记得我以前这么编过这个程序
是的,加上abs,物理意义没有了,讲不通。实数肯定没问题,关键是sqrt函数里面是个负数,开根号出来是个虚数,加abs出来的东西就没有物理意义,当然sqrt里面是负数,开根号出来(应该是角速度)本身是个虚数就没有物理意义,加abs出来的肯定也不是个玩意,嘿。gghhjj把sqrt开根号出来的数(实数或复数)实部为0的点去掉了,这个物理上也说不通啊,在摆到最高点如果速度为零,这样的点肯定要的。还有,把所有实部不为零的点画出来,有可能实部不为零,但是虚部也不为零的情况,应该也是没有物理意义,我想是这样的。不知道对否:@)

我想应该是把sqrt开根号出来没有物理意义的点,即角速度为虚数的点剔除,不应该剔除实部为零的点。
借gghhjj兄的程序,改了一点点,出来的结果好像没啥变化::loveliness:

for H= %取这几个总能量值画相图(用能量法画的),就是相图里面一条曲线对应一个H值。
    theta0=-3*pi:0.001:3*pi; %theta0为大角度振动摆角范围
    theta1=sqrt(2*(H-1+cos(theta0))); %计算不同角度下的角速度theta1
    theta=;
    theta2=theta(imag(theta(:,2))==0,:);
%%就上面这里改了一点点,呵呵,不过不知道为什么写成theta2=theta(imag(theta(:,2))==0,imag(theta(:,2))==0);不行?
%%这是Matlab的基本问题,在n×2矩阵中取一些行组成的矩阵难道只需要控制了第一个列元素就可以,后面的第2列元素会从矩阵中所有
%%列中把跟前面取出来的第一列若干行对应的后面第2列元素取出来的?就是第二列用:就可,把控制条件再在第二列位置写一次就不行?
%%加了再控制一次怎么还出错啊?这样两列元素个数只会是相等的啊,按道理不会报错啊
plot(theta2(:,1),theta2(:,2),'.','MarkerSize',1) %绘制大角度振动的相图(上半部分)
axis 'equal'
hold on
plot(theta2(:,1),-theta2(:,2),'.','MarkerSize',1) %绘制大角度振动的相图(下半部分)
axis 'equal'
hold on
end

[ 本帖最后由 wh1125 于 2007-6-16 21:53 编辑 ]

gghhjj 发表于 2007-6-17 06:37

不过不知道为什么写成theta2=theta(imag(theta(:,2))==0,imag(theta(:,2))==0);不行?

这个显然是不行的

theta2=theta(imag(theta(:,2))==0,:);
上面的代码指得是行根据imag(theta(:,2))==0来判断是否保留相应的行
: 则表示列不变

gghhjj 发表于 2007-6-17 06:40

借gghhjj兄的程序,改了一点点,出来的结果好像没啥变化

其实两者图形是不一样的
我的图形里缺少sqrt为零的情况
当时贴出来也想到这个问题了
但是从图的总体上来看是看不出区别的
因此就懒得改了

[ 本帖最后由 无水1324 于 2007-6-17 09:12 编辑 ]

无水1324 发表于 2007-6-17 09:14

性质完全改变,图形也是有大的变化的

wh1125 发表于 2007-6-17 09:47

原帖由 gghhjj 于 2007-6-17 06:37 发表 http://www.chinavib.com/forum/images/common/back.gif
QUOTE:
不过不知道为什么写成theta2=theta(imag(theta(:,2))==0,imag(theta(:,2))==0);不行?


这个显然是不行的
QUOTE:
theta2=theta(imag(theta(:,2))==0,:);


上面的代码指得是行根据imag(theta(:,2))==0来判断是否保留相应的行
: 则表示列不变

这个代码的意思我懂,关键是theta2=theta(imag(theta(:,2))==0,:);是保留相应的满足要求的行,但所有列不变,那岂不是第一列的行是选出来的,第二列的行是原矩阵中的所有行??组成的新矩阵维数不对啊?我是想用theta2=theta(imag(theta(:,2))==0,imag(theta(:,2))==0);对两列中的所有行都进行筛选,而且筛选条件一样,那样出来的维数(新矩阵两列的行数)才会相等啊?但是实际情况是,这样做反而报错,维数不匹配。想不通啊~

[ 本帖最后由 wh1125 于 2007-6-17 09:49 编辑 ]

gghhjj 发表于 2007-6-19 02:25

呵呵

theta2(m,n)
保留的行m是由imag(theta(:,2))==0决定的
n是列数,在上面的总共才两列,都是你需要的,因此直接用:表示所有的列

wh1125 发表于 2007-6-19 11:58

原帖由 gghhjj 于 2007-6-19 02:25 发表 http://www.chinavib.com/forum/images/common/back.gif
呵呵

theta2(m,n)
保留的行m是由imag(theta(:,2))==0决定的
n是列数,在上面的总共才两列,都是你需要的,因此直接用:表示所有的列
谢谢!
我现在应该算是真正弄懂了这语句的意思:loveliness:,m条件是对矩阵的行(向量)进行筛选,而不是只对第一列的行(元素)进行筛选;n是对矩阵的列(向量)进行筛选,如果n不是:而是一个具体的条件,那theta2(m,n)语句应该是m,n两个条件对行向量和列向量双重筛选出来的交集元素形成的子矩阵。应该是这样吧,呵呵!

[ 本帖最后由 wh1125 于 2007-6-19 17:18 编辑 ]
页: 1 [2] 3
查看完整版本: 求教 Matlab怎么画点与点的连线?