士郎小天使 2022-04-14 16:36 采纳率: 81.1%
浏览 596
已结题

matlab中如果方程有累加要如何利用for循环写

img

就是有一组数x,用for循环写出如图的这种式子,带入进去
其中I0(0.5)和In(0.5)是第一类修正贝塞尔函数,可以直接用matlab命令写,分别为besseli(0,0.5),besseli(n,0.5)
我先用syms命令写了个出来,但是计算的特别慢,就想着直接用for循环写
这是syms的程序,如果只带几个数进去能算出来,但是x的数量一多就卡主

X = xlsread('fengxiang.xlsx'); %X是一组0-360度的列向量,有2万个数左右
n=1:1000 %累加到1000就差不多够了
syms x
F(x)=(x*besseli(0,0.5)+2*sum(besseli(n',0.5).*sind(n'.*(x-260))./n'))./(2*pi*besseli(0,0.5))
double(F(X))

所以思考直接用for循环写,这里就不知道哪里出问题了,for循环计算的挺快的,但是算出来把F(x)直接求和了,前面全是0,最后一个是很大的数字

X = xlsread('fengxiang.xlsx'); %X是一组0-360度的列向量
n0=length(X)
n=1:1000
for i=n0
F(i)=(X(i)*besseli(0,0.5)+2*sum(besseli(n',0.5).*sind(n'.*(X(i)-260))./n'))./(2*pi*besseli(0,0.5))
end
  • 写回答

5条回答 默认 最新

  • czy1219 2022-04-14 20:28
    关注

    修改后的程序,计算10万个数据仅用时1s!

    img


    下面是详细代码,带注释!

    clear all
    clc
    %先用一个数组存放besseli(n,0.5),n的范围为1-100
    
    %(1)为什么n只取到100?
    %因为n越大besseli(n,0.5)越小
    %当n取100时besseli(100,0.5)=6.6722e-219,再往后面计算没有意义,无限趋近于0
    %也就是说n越大,求和那部分无限接近于0,所以只取到100即可
    
    %(2)为什么要用数组存放?
    %因为每次计算都要算一遍besseli(i,0.5),比较浪费时间,尤其是x很多的时候
    %存放到数组中每次索引速度是很快的
    
    tic
    tempnums=zeros(1,100);
    for i=1:100
        tempnums(i)=besseli(i,0.5);
    end
    
    %这里以10万个数据为例
    x=(1:100000);
    len = length(x);
    f=zeros(1,len);
    for i=1:len
        %tempvalue用来计算求和部分的值
        tempvalue=0.0;
        for j=1:100
            %求和部分计算
            tempvalue=tempvalue+2*(tempnums(j)*sind(j*(x(i)-260))/j);
        end
        %把求和部分放回原始式子计算
        f(i)=(tempvalue+x(i)*besseli(0,0.5))/(2*pi*besseli(0,0.5));
    end
    toc
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)