就是有一组数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!
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循环,只要表达式的逻辑搞清楚,随便循环