吾爱光设

会员须知
会员须知
实用帮助
实用帮助
查看: 4876|回复: 2

【求助】怎么用matlab画带有贝塞尔函数的三维积分图

[复制链接]
  • TA的每日心情

    2024-11-4 16:11
  • 签到天数: 180 天

    [LV.7]常住居民III

    2

    主题

    14

    回帖

    0

    积分

    小白

    积分
    0
    发表于 2021-10-13 21:13 | 显示全部楼层 |阅读模式
    本帖最后由 z晓晓 于 2021-10-13 21:16 编辑

    麻烦请问一下,有大佬知道我的程序错在哪里吗?我想利用的是图2的公式(2),画图3的第一张图。但是matlab一直报错,如图一。我改了很多次了仍然解决不了。希望有朋友可以帮忙解答.>> lamda=6328e-10;
    >>R=0.01;
    >>n=1.5;
    >>fai=pi/180;
    >>k=2*pi/lamda;
    >>i=sqrt(-1);
    >>  r1=linspace(-0.5,0.5);
    >>z=linspace(0,1000);
    >>[R1,Z]=meshgrid(r1,z);
    >>  E2=@(r) besselj(0,k*r*R1./Z)*exp(i*k*(r^2+R1.^2)/2/Z)*exp(-i*k*(n-1)*fai.*r)*r;
    >>E3=integral(E2,0,R);






    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?注册

    ×
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2022-10-10 21:59
  • 签到天数: 114 天

    [LV.6]常住居民II

    11

    主题

    87

    回帖

    37

    积分

    新手

    积分
    37
    发表于 2021-10-13 22:56 | 显示全部楼层
    本帖最后由 zzz在路上 于 2021-10-14 08:13 编辑

    报错原因是r和z的维数不一致导致的错误。这个问题的思路应该是用for循环:
    >>z=linspace(0,1000);
    >>[R1,Z]=meshgrid(r1,z);
    >>  E2=@(r) besselj(0,k*r*R1./Z)*exp(i*k*(r^2+R1.^2)/2/Z)*exp(-i*k*(n-1)*fai.*r)*r;
    >>E3=integral(E2,0,R);
    改为:
    for index_z=1:length(z)           
          for index_r=1:length(r1)
               E2(index_r,index_z)=@(r) besselj(0,k*r*r1(index_r)./z(index_z))*exp(i*k*(r^2+r1(index_r).^2)/2/z(index_z))*exp(-i*k*(n-1)*fai.*r)*r;
               E3(index_r,index_z)=integral(E2,0,R);
         end
    end



    未详细验证,大体思路是这个











    评分

    参与人数 1金币 +1 收起 理由
    + 1

    查看全部评分

    连续加班,好累
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-10-29 19:42
  • 签到天数: 280 天

    [LV.8]以坛为家I

    3

    主题

    12

    回帖

    6

    积分

    小白

    积分
    6
    发表于 2021-10-23 23:15 | 显示全部楼层
    本帖最后由 一模 于 2021-10-23 23:16 编辑

    我感觉是因为函数表达式里的r是一个值,而程序里的R1,Z都是矩阵,所以会造成矩阵纬度不匹配的问题,楼上的大佬说得对,可以用for循环解决,我改了一下程序。
    clear
    lamda=6328e-10;
    R=0.01;
    n=1.5;
    fai=pi/180;
    k=2*pi/lamda;
    i=sqrt(-1);
    r1=linspace(-0.5,0.5);
    z=linspace(0,1000);
    % [R1,Z]=meshgrid(r1,z);
    %   E2=@(r) besselj(0,k.*r.*R1./Z).*exp(i*k.*(r^2+R1.^2)/2/Z).*exp(-i*k.*(n-1).*fai.*r).*r;
    % E2=@(r) besselj(0,k.*r.*0.5./1).*exp(i*k*(r.^2+0.5^2)/2/1);
    % E3=integral(E2,0,R);
    E3=zeros(length(r1),length(z));
    for m=1:length(r1)
        for n=1:length(z)
    %     E2=@(r) besselj(0,k.*r.*r1(m)./z(n)).*exp(i*k*(r.^2+r1(m).^2)/2/z(n))
        E2=@(r) besselj(0,k.*r.*r1(m)./z(n)).*exp(i*k*(r.^2+r1(m).^2)/2/z(n)).*exp(-i*k.*(n-1).*fai.*r).*r;
        E3(m,n)=abs(integral(E2,0,R));
        end
    end
    mesh(E3)
    因为我的电脑太慢了,所以直接假设透过率函数为1进行了测试,跑通了,不知道是不是题主想要的。for循环的效率比较低,如果题主有更高效率的方法,我们可以继续交流一下

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?注册

    ×

    评分

    参与人数 1金币 +3 收起 理由
    + 3

    查看全部评分

    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

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

    本版积分规则

    联系我们|本论坛只支持PC端注册|手机版|小黑屋|吾爱光设 ( 粤ICP备15067533号 )

    GMT+8, 2024-11-6 23:21 , Processed in 0.125000 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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