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

修改后的程序,计算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

@for(demend(i):@sum(supply(j):x(i,j)


X = xlsread('fengxiang.xlsx'); %X是一组0-360度的列向量
n0=length(X)
n=1:1000
for i=1: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

累加

X = xlsread('fengxiang.xlsx'); %X是一组0-360度的列向量
n0=length(X)
F=0
n=1:1000
for i=1:n0
F=F+(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

for循环可以嵌套的,for语句里边再用for循环,只要表达式的逻辑搞清楚,随便循环