找回密码
 注册
Simdroid-非首页
查看: 154|回复: 7

matlab 简单问题请教

[复制链接]
发表于 2011-3-31 15:11:09 | 显示全部楼层 |阅读模式 来自 四川成都
请问这样编程画图可以不?
syms x w;
f=2./((2*pi).^0.5*x)*exp(-(log(x)-log(1.2)).^2*4);
f1=int(x*f,x,0,w);
f2=int(f,x,0,w);
f3=f1/f2;
fplot('f3',[0.1,10],1*exp-4)
发表于 2011-3-31 16:36:29 | 显示全部楼层 来自 陕西西安
Simdroid开发平台
1# 千亿星辰
你这个是接着昨天的问题么?感觉还是没有理清思路。我这里只是猜想你想通过几个表达式,积分后,f3随w变化的图线。
  1. f1=@(w)quad(@(x)x.*2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  2. f2=@(w)quad(@(x)2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  3. w=linspace(0.1,10);
  4. plot(w,arrayfun(@(w)f1(w)./f2(w),w))
  5. grid;
复制代码

PS:对于这个代码,我在想能够简化不?就是通过两个匿名函数f1,f2,直接形成第三个f3的匿名函数,变量同为w?
请版上的各位朋友看看行不行,我搜索了一下,用匿名函数来生成匿名函数好像讨论的不多

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-3-31 19:46:01 | 显示全部楼层 来自 黑龙江牡丹江
匿名函数来生成匿名函数,rocwoods版主讨论的较多,你可以搜搜rocwoods版主以前的贴子或者参考rocwoods版主的《MATLAB高效编程技巧与应用:25个案例分析》那本书,比如:
http://forum.simwe.com/thread-885049-1-1.html
http://forum.simwe.com/thread-961191-1-1.html
http://forum.simwe.com/thread-931918-1-1.html
回复 不支持

使用道具 举报

发表于 2011-3-31 19:50:02 | 显示全部楼层 来自 英国
本帖最后由 nwcwww 于 2011-3-31 20:00 编辑
1# 千亿星辰  
你这个是接着昨天的问题么?感觉还是没有理清思路。我这里只是猜想你想通过几个表达式,积分后,f3随w变化的图线。
f1=@(w)quad(@(x)x.*2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
...
mhkmars 发表于 2011-3-31 16:36


f1f2生成一个匿名函数f3倒是挺容易。。
不过如果直接ezplot(f3,[0.110]),
应该会比你用plot+arrayfun(@(w)f1(w)./f2(w),w)更慢。
而用plot+arrayfun(@(w)f3(w),w)的话和你的方法速度差不多。


用ezplot+f3:




  1. clear;figure;tic;
  2. f1=@(w)quad(@(x)x.*2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  3. f2=@(w)quad(@(x)2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  4. f3=@(w)f1(w)/f2(w);
  5. ezplot(f3,[0.1,10]);grid;toc


  6. Elapsed time is 0.786917 seconds.

复制代码


用plot+arrayfun+f3:




  1. clear;figure;tic;
  2. f1=@(w)quad(@(x)x.*2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  3. f2=@(w)quad(@(x)2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  4. f3=@(w)f1(w)/f2(w);
  5. w=linspace(0.1,10);plot(w,arrayfun(@(w)f3(w),w));grid;toc


  6. Elapsed time is 0.167830 seconds.

复制代码


用plot+arrayfun+f1+f2,也就是你的代码:


  1. clear;figure;tic;
  2. f1=@(w)quad(@(x)x.*2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  3. f2=@(w)quad(@(x)2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  4. w=linspace(0.1,10);plot(w,arrayfun(@(w)f1(w)./f2(w),w));grid;toc


  5. Elapsed time is 0.180164 seconds.

复制代码
后两种方法在速度上没啥差别。。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-3-31 20:02:41 | 显示全部楼层 来自 陕西西安
3# messenger
谢谢斑竹,找到了,还是自己有点马虎。下面这样写就可以了,匿名函数生成匿名函数。

  1. clc;clear;
  2. f1=@(w)quad(@(x)x.*2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  3. f2=@(w)quad(@(x)2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4),0,w);
  4. f3=@(w)f1(w)/f2(w)
  5. fplot(f3,[0.1,10])
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-3-31 20:36:06 | 显示全部楼层 来自 陕西西安
4# nwcwww
学习了
觉得论坛上确实是藏龙卧虎咯,O(∩_∩)O哈哈~。又学习到了ezplot的用法了,还进行了优劣的比较。
我本人也才接触matlab不久,一个个帖子看下来,觉得有意思的就自己help一下,兴趣是好老师,慢慢的,沉浸下来,发现真的能够学到好多东西。
感谢所有帮助过我的朋友,谢谢,O(∩_∩)O哈哈~
回复 不支持

使用道具 举报

发表于 2011-4-1 08:36:46 | 显示全部楼层 来自 河北廊坊
6# mhkmars
还可以这样再改下

  1. clc;clear;
  2. f=@(x)2./((2*pi).^0.5*x).*exp(-(log(x)-log(1.2)).^2*4);
  3. f3=@(w)quad(@(x)x.*f(x),0,w)./quad(f,0,w);
  4. fplot(f3,[0.1,10])
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-4-1 13:50:23 | 显示全部楼层 来自 陕西西安
7# qibbxxt
恩,这样写更简洁,学习一下。
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-4 23:29 , Processed in 0.036984 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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