声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

楼主: yina_111

[其他相关] 求教 Matlab怎么画点与点的连线?

[复制链接]
发表于 2007-6-14 22:35 | 显示全部楼层

你要把点连接起来,我倒感觉有时在一个区间的函数值分成几段,比如在[-6pi,6pi]区间微分方程解的曲线是三个独立的圆,但Matlab却把中间有没有值(即x在一定区间,y没有值)不该连的点用一条水平线连接起来了,要把那条线去掉,好麻烦,要把整个区间分成几段对端点处理一下才能分开成三个圆。我是这样干的,不知道有没有更好更简便的方法。
不知道我说清楚这个问题没,呵`·`:@D
回复 支持 反对
分享到:

使用道具 举报

发表于 2007-6-15 08:48 | 显示全部楼层

回复 #16 wh1125 的帖子

完全没有看懂,没有意义的解是不会显示出来的。
发表于 2007-6-15 09:35 | 显示全部楼层

回复 #16 wh1125 的帖子

没看明白,或许你有具体实例?
发表于 2007-6-15 21:13 | 显示全部楼层
比如这个相图中,中间应该是没有那一条横线的(纵轴坐标为0那一条线)。我的方法是对横坐标分成几段,在几个端点位置把坐标特别处理了画出来的才会消失那条线,不过很麻烦。

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

for H=[0:0.2:1,1.5,2:5] %取这几个总能量值画相图(用能量法画的),就是相图里面一条曲线对应一个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
11.jpg
发表于 2007-6-15 21:26 | 显示全部楼层
这个可能数学和编写程序之间理解存在误差的问题啊,改成这样就没有中间那条线了,就加了一个abs命令
for H=[0:0.2:1,1.5,2:5] %取这几个总能量值画相图(用能量法画的),就是相图里面一条曲线对应一个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 编辑 ]
tt.jpg
发表于 2007-6-15 21:31 | 显示全部楼层
也有可能加上abs意义变了,不过记得我以前这么编过这个程序
发表于 2007-6-16 08:09 | 显示全部楼层
  1. for H=[0:0.2:1,1.5,2:5] %取这几个总能量值画相图(用能量法画的),就是相图里面一条曲线对应一个H值。
  2.     theta0=-3*pi:0.001:3*pi; %theta0为大角度振动摆角范围
  3.     theta1=sqrt(2*(H-1+cos(theta0))); %计算不同角度下的角速度theta1
  4.     theta=[theta0',theta1'];
  5.     theta2=theta(real(theta(:,2))~=0,:);
  6. plot(theta2(:,1),theta2(:,2),'.','MarkerSize',1) %绘制大角度振动的相图(上半部分)
  7. axis 'equal'
  8. hold on
  9. plot(theta2(:,1),-theta2(:,2),'.','MarkerSize',1) %绘制大角度振动的相图(下半部分)
  10. axis 'equal'
  11. hold on
  12. end
复制代码

p.JPG

评分

1

查看全部评分

发表于 2007-6-16 09:02 | 显示全部楼层

回复 #22 gghhjj 的帖子

谢谢!gghhjj
你太强了
发表于 2007-6-16 21:45 | 显示全部楼层
原帖由 咕噜噜 于 2007-6-15 21:31 发表
也有可能加上abs意义变了,不过记得我以前这么编过这个程序

是的,加上abs,物理意义没有了,讲不通。实数肯定没问题,关键是sqrt函数里面是个负数,开根号出来是个虚数,加abs出来的东西就没有物理意义,当然sqrt里面是负数,开根号出来(应该是角速度)本身是个虚数就没有物理意义,加abs出来的肯定也不是个玩意,嘿。gghhjj把sqrt开根号出来的数(实数或复数)实部为0的点去掉了,这个物理上也说不通啊,在摆到最高点如果速度为零,这样的点肯定要的。还有,把所有实部不为零的点画出来,有可能实部不为零,但是虚部也不为零的情况,应该也是没有物理意义,我想是这样的。不知道对否:@)

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

for H=[0:0.2:1,1.5,2:5] %取这几个总能量值画相图(用能量法画的),就是相图里面一条曲线对应一个H值。
    theta0=-3*pi:0.001:3*pi; %theta0为大角度振动摆角范围
    theta1=sqrt(2*(H-1+cos(theta0))); %计算不同角度下的角速度theta1
    theta=[theta0',theta1'];
    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 编辑 ]
1.jpg

评分

1

查看全部评分

发表于 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来判断是否保留相应的行
: 则表示列不变
发表于 2007-6-17 06:40 | 显示全部楼层
借gghhjj兄的程序,改了一点点,出来的结果好像没啥变化


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

[ 本帖最后由 无水1324 于 2007-6-17 09:12 编辑 ]
发表于 2007-6-17 09:14 | 显示全部楼层
性质完全改变,图形也是有大的变化的
发表于 2007-6-17 09:47 | 显示全部楼层
原帖由 gghhjj 于 2007-6-17 06:37 发表
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 编辑 ]
发表于 2007-6-19 02:25 | 显示全部楼层
呵呵

theta2(m,n)
保留的行m是由imag(theta(:,2))==0决定的
n是列数,在上面的总共才两列,都是你需要的,因此直接用:表示所有的列
发表于 2007-6-19 11:58 | 显示全部楼层
原帖由 gghhjj 于 2007-6-19 02:25 发表
呵呵

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

谢谢!
我现在应该算是真正弄懂了这语句的意思:loveliness:,m条件是对矩阵的行(向量)进行筛选,而不是只对第一列的行(元素)进行筛选;n是对矩阵的列(向量)进行筛选,如果n不是:而是一个具体的条件,那theta2(m,n)语句应该是m,n两个条件对行向量和列向量双重筛选出来的交集元素形成的子矩阵。应该是这样吧,呵呵!

[ 本帖最后由 wh1125 于 2007-6-19 17:18 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-28 04:13 , Processed in 0.134052 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表