查看: 222|回复: 4|关注: 0

[已解决] plot3函数画图求助!

[复制链接]

新手

9 麦片

财富积分


050


2

主题

7

帖子

0

最佳答案
  1. function dy = msd(t,y,c,k,m)
  2. %Store the differential equation and is called by ode45
  3. if m~=0
  4.     dy = zeros(2,1);
  5.     dy(1) = y(2);
  6.     dy(2) = -c/m*y(2)-k/m*y(1);
  7. else
  8.     dy = zeros(2,1);
  9.     dy(1) = -k/c*y(1);
  10. end
  11. end
复制代码
  1. function msd_water(c,k,m,yi,vi,t_beg,t_end)
  2. N = length(m);
  3. for i =1:N
  4. [t,pos] = ode45(@msd,[t_beg t_end],[yi vi],[],c,k,m(i));
  5. end
  6. end
复制代码
c = 0.2
k = 0.1
m = (0,20,0.1)
yi = 10
vi = 5
t_beg = 0
t_end = 100
我用上面的程序能求得每一个m对应的状态,我要用plot3把每个m对应的 t 和 pos(:,1)画在一张图里,如下所示
我遇到的问题是不同m对应的 t 和pos(:,1)的行数是不同的,我没法把它合并,也没法单独画出每个m对应的图像
pic1.PNG
回复主题 已获打赏: 0 积分

举报

新手

9 麦片

财富积分


050


2

主题

7

帖子

0

最佳答案
 楼主| 发表于 2020-5-22 21:38:04 | 显示全部楼层
  1. function msd_water(c,k,m,yi,vi,t_beg,t_end)
  2. N = length(m);
  3. for i =1:N
  4. [t,pos] = ode45(@msd,[t_beg t_end],[yi vi],[],c,k,m(i));
  5. y =ones(length(t),1)*m(i);
  6. plot3(t,y,pos(:,1),'color','k');
  7. hold on
  8. end
  9. end
复制代码
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

5

主题

2338

帖子

706

最佳答案
  • 关注者: 196
发表于 2020-5-23 06:18:23 | 显示全部楼层 |此回复为最佳答案
调用 ode45 函数的时候自己指定时间步长,即指定需要计算的对应的时间序列的向量,这样可以控制每次调用都得到维度一致的解。把解存入矩阵然后调用surf之类的函数绘制三维图就是了
  1. c = 0.2;
  2. k = 0.1;
  3. m = [ 0 : 1 : 20 ];
  4. yi = 10;
  5. vi = 5;
  6. t_beg = 0;
  7. t_end = 300;
  8. N = length( m );
  9. for i = 1 : 1 : N
  10.     [ t, pos{ 1, i } ] = ode45( @msd, [ t_beg : 1 : t_end ],[ yi vi ], [], c, k, m( i ) );
  11.     Z( i, : ) = ( pos{ 1, i }( :, 1 ) ).';
  12. end
  13. [ T, Y ] = meshgrid( t, m );

  14. surf( T, Y, Z, ...
  15.     'FaceAlpha', 0.5, 'MeshStyle', 'row', ...
  16.     'LineStyle', '-', 'LineWidth', 0.2 );
复制代码
提问请:①准确描述问题②提出你的思考(等着抄作业的一律锁帖)③提供代码文本而非截图④及时反馈
回复此楼 已获打赏: 0 积分

举报

新手

9 麦片

财富积分


050


2

主题

7

帖子

0

最佳答案
 楼主| 发表于 2020-5-23 10:25:30 | 显示全部楼层
TouAkira 发表于 2020-5-23 06:18
调用 ode45 函数的时候自己指定时间步长,即指定需要计算的对应的时间序列的向量,这样可以控制每次调用都 ...

感谢,虽然我自己上面已经给出一种解法了。
我还想问一下您
11行代码中  Z( i, : ) = ( pos{ 1, i }( :, 1 ) ).'; pos{1,i}(:,1)代表什么意思
再次感谢
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

5

主题

2338

帖子

706

最佳答案
  • 关注者: 196
发表于 2020-5-23 23:44:15 | 显示全部楼层
小拉哩 发表于 2020-5-22 22:25
感谢,虽然我自己上面已经给出一种解法了。
我还想问一下您
11行代码中  Z( i, : ) = ( pos{ 1, i }( :,  ...

每个i步长求的数值解存入pos元胞数组对应的位置,然后只调用该元胞数组数据的第一列。由于绘图格式的需求需要将该列转置然后存入Z矩阵对应的第i行。都是基本语法,建议自己多试一试,比如逐行运行并查看工作区计算出来的变量的变化,这种学习方式会比我挨个解释更有效。
提问请:①准确描述问题②提出你的思考(等着抄作业的一律锁帖)③提供代码文本而非截图④及时反馈
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

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