2008057 发表于 2010-11-18 21:00

粒子群算法解非线性方程组问题

哪位高手帮我看看,我自己编了一个粒子群算法解非线性方程组的,可是运行起来不好使,
c1=input('输入学习因子C1:2.8');
c2=input('输入学习因子C2:1.3');
w=input('输入惯性因子w:1');
N=input('初始化群体数目N(行数):');
D=input('搜索空间维数(自变量个数,列数)D:');
MaxCir=input('最大迭代次数MaxCir:');
Minx=input('输入变量下限:');
Maxx=input('输入变量上限:');
jzss=input('输入接种新粒子中元素占Pg元素个数大于1小于D:');
eps=10^(-6);         %精度
for i=1:N
    for j=1:D
      x(i,j)=Minx+rand()*(Maxx-Minx);%位置初始化
      v(i,j)=rand;                     %速度初始化
    end
end
%-----------------------------------------------------
%计算适应度,并初始化Pi(个体最优),Pg(群体最优)---------
for i=1:N
    P(i,:)=x(i,:);
    y(i,:)=x(i,:);                  %y()为最优个体群
end
Pg=x(1,:);
for i=2:N
    if fitness(x(i,:),D)<fitness(Pg,D)
      Pg=x(i,:);                  %Pg为群体最优
    end
end
%------------------------------------------------------
%进入主循环,按PSO迭代公式迭代,直至超出循环次数或满足精度-
for t=1:MaxCir
    for i=1:N
      v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(Pg-x(i,:)); %速度更新
      x(i,:)=x(i,:)+v(i,:);                                        %位置更新
      for j=1:D
            if x(i,j)<Minx || x(i,j)>Maxx
                x(i,j)=Minx+rand()*(Maxx-Minx)%超出范围重新初始化
            end
      end   
      if fitness(x(i,:),D)<fitness(P(i,:),D)
            P(i,:)=fitness(x(i,:),D);         %个体选优
            y(i,:)=x(i,:);
      end   
      if P(i,:)<fitness(Pg,D)               %群体选优
            Pg=y(i,:);
      end   
    end
    Pg=inoculation(x,Pg,D,N,jzss);
    x=immunity(x,D,N,Maxx,Minx);
    Pbest(t)=fitness(Pg,D);
end   
%-------------------------------------------------------
%显示最终结果--------------------------------------------
disp('函数最优解为:')
Pg
disp('最优极值为:')
fitness(Pg,D)
%-------------------------------------------------------
function G=fitne(a)
FA1=@(x)x.*exp(a(1).*x+a(2).*x.^2+a(3).*x.^3);
FA2=@(x)exp(a(1).*x+a(2).*x.^2+a(3).*x.^3);
f1=quad(FA1,-0.1,0.1)/quad(FA2,-0.1,0.1)-0.0003344;
FB1=@(x)x.^2.*exp(a(1).*x+a(2).*x.^2+a(3).*x.^3);
FB2=@(x)exp(a(1).*x+a(2).*x.^2+a(3).*x.^3);
f2=quad(FB1,-0.1,0.1)/quad(FB2,-0.1,0.1)-0.0011;
FC1=@(x)x.^3.*exp(a(1).*x+a(2).*x.^2+a(3).*x.^3);
FC2=@(x)exp(a(1).*x+a(2).*x.^2+a(3).*x.^3);
f3=quad(FC1,-0.1,0.1)/quad(FC2,-0.1,0.1)+0.0000144;
g=;
%%%%%%%%%%%%%%%%%%%%%%%%%%~~~~~~~~~~~~~~~~~
function result=fitness(a,D)
options = optimset('Display','off');
= fsolve(@fitne(a),a,options);
a=a;
result=fval;
程序运行总是出现如下错误:
输入学习因子C1:2.8
输入学习因子C2:1.3
输入惯性因子w:1
初始化群体数目N(行数):40
搜索空间维数(自变量个数,列数)D:3
最大迭代次数MaxCir:200
输入变量下限:-1
输入变量上限:1
输入接种新粒子中元素占Pg元素个数大于1小于D:2
??? Error: File: D:\work\fitness.m Line: 4 Column: 25
Unbalanced or misused parentheses or brackets.

Error in ==> pso at 30
    if fitness(x(i,:),D)<fitness(Pg,D)

zhouyang664 发表于 2010-11-18 21:59

看错误提示显然是少半个括号,但是问题远不止如此:
首先,这个文件中包含调用函数function G=fitne(a),那么这个文件必须存成function格式,在文件开始加上
   function myfun()
然后将文件存成myfun.m。还有存成function格式之后呢,你的子函数就必须用end与function匹配!你重新把function对应的end加一下
我copy了这个文件只能调试成这样了,专业知识我一点也不懂,你再调调,然后再往上放吧!

Happy99 发表于 2010-11-19 16:13

本帖最后由 Happy99 于 2010-11-19 16:13 编辑

那个错误讯息告知
= fsolve(@fitne(a),a,options);
应该改为
= fsolve(@fitne,a,options);

还有不得不说下
Error in ==> pso at 30
    if fitness(x(i,:),D)<fitness(Pg,D)
但LZ给的程序在第25行
??? Error: File: D:\work\fitness.m Line: 4 Column: 25
但LZ给的又不确定:@Q

不要忘记, 给的讯息愈正确详细, 别人也愈容易帮lz解决
页: [1]
查看完整版本: 粒子群算法解非线性方程组问题