声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1402|回复: 2

[编程技巧] 粒子群算法解非线性方程组问题

[复制链接]
发表于 2010-11-18 21:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
哪位高手帮我看看,我自己编了一个粒子群算法解非线性方程组的,可是运行起来不好使,
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=[f1,f2,f3];
%%%%%%%%%%%%%%%%%%%%%%%%%%~~~~~~~~~~~~~~~~~
function result=fitness(a,D)
options = optimset('Display','off');
[a,fval] = 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)

点评

标题不清?  发表于 2010-11-21 00:37
回复
分享到:

使用道具 举报

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

发表于 2010-11-19 16:13 | 显示全部楼层
本帖最后由 Happy99 于 2010-11-19 16:13 编辑

那个错误讯息告知
[a,fval] = fsolve(@fitne(a),a,options);
应该改为
[a,fval] = 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解决
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-18 11:20 , Processed in 0.064730 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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