10种基于MATLAB的方程组求解方法

2023-11-05

          线性方程组的求解包括直接法和迭代法,其中迭代法包括传统的高斯消元法,最速下降法,牛顿法,雅克比迭代法,共轭梯度法,以及智能启发式算法求解法和神经网络学习算法,传统算法可以相互组合改进,智能仿生启发式算法包括粒子群算法,遗传算法,模拟退火算法,布谷鸟算法狼群算法,樽海鞘算法,天牛须算法等各种启发算法都可以求解,神经网络算法包括BP神经网络,RBF神经网络,DBN神经网络,CNN神经网络等机器学习算法,总之求解方法凡凡总总,本文仅介绍10种方法如下:

        一、直接法

         直接法就是经过有限步算术运算,可求得线性方程组精确解的方法(若计算过程中没有舍入误差)。常用于求解低阶稠密矩阵方程组及某些大型稀疏矩阵方程组(如大型带状方程组)。MATLAB代码如下:

    clc
    clear
    close all
    q = [2 0 2 7 
           7 7 1  3
           3 8 2  0
           2 7 7 7];
    b  = [1;3;3;8];
    x = q\b

   求解结果 x =

                       0.9505
                      -0.5099
                       2.1139
                      -0.7327

  二、高斯消元法

      数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解,MATALB代码如下:

clc
clear
close all
q = [2 0 2 7 
     7 7 1  3
     3 8 2  0
     2 7 7 7];
 b  = [1;3;3;8];
n=length(q);
a=[q,b];
for k=1:n-1
maxa=max(abs(a(k:n,k)));
if maxa==0
return;
end

    for i=k:n

        if abs(a(i,k))==maxa

            y=a(i,k:n+1);a(i,k:n+1)=a(k,k:n+1);a(k,k:n+1)=y;

            break;
        end
     end

    for i=k+1:n

       l(i,k)=a(i,k)/a(k,k);

       a(i,k+1:n+1)=a(i,k+1:n+1)-l(i,k).*a(k,k+1:n+1);

    end
end

if a(n,n)==0
return
end

x(n)=a(n,n+1)/a(n,n);
for i=n-1:-1:1
x(i)=(a(i,n+1)-sum(a(i,i+1:n).*x(i+1:n)))/a(i,i);

end
fprintf('x= %10.9f\n', x) 

求解结果 x = 0.9505  

                   -0.5099  

                   2.1139  

                  -0.7327

 三、共轭梯度法

     clc共轭梯度法(Conjugate Gradient)是介于最速下降法牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,MATLAB代码如下
clear
close all
DIM=4;
tic
A=10*rand(DIM);% A元素是0-100
for i=1:DIM
    A(i,i)=sum(abs(A(i,:)))+25*rand(1); %对角占优的量为0~25
end
b=zeros(DIM,1);
for i=1:DIM;
    x=0;
    for r=1:DIM;
    x=x+A(i,r);
    end
    b(i,1)=x;
end   %产生b矩阵,b中的元素为A中对应行的和,目的是使方程解全为 1

jd=10^-6;
x0=zeros(DIM,1); %初始迭代矩阵
r=b-A*x0;%剩余向量
p=r;
ak=dot(r,r)/dot(p,A*p);
y=x0+ak*p;  %迭代公式
r1=r-ak*A*p;
bk=dot(r1,r1)/dot(r,r);
p1=r1+bk*p;
s=1; %迭代次数
while norm(y-x0)>=jd&&s<3000; %迭代条件
    x0=y;
    p=p1;
    r=r1;
    ak=dot(r,r)/dot(p,A*p);
    y=x0+ak*p;  %迭代公式
   r1=r-ak*A*p;
   bk=dot(r1,r1)/dot(r,r);
    p1=r1+bk*p;
    s=s+1;
end
t=1:DIM;
aerr=abs(y'-1)/1;
plot(t,aerr);
title('绝对误差图')

四、最速下降法

简要介绍:

MATLAB代码如下:

n = 0;
x0 = [0 0 0 0]';
DIM=4;
tic
A=10*rand(DIM);% A元素是0-100
for i=1:DIM
    A(i,i)=sum(abs(A(i,:)))+25*rand(1); %对角占优的量为0~25
end
b=zeros(DIM,1);
for i=1:DIM;
    x=0;
    for r=1:DIM;
    x=x+A(i,r);
    end
    b(i,1)=x;
end   %产生b矩阵,b中的元素为A中对应行的和,目的是使方程解全为 1
r = A*x0 - b;
p = -r;
eps=10^-3;
t = cputime;

while (norm(r,2) > eps)&&n<2000
 
     alpha = (r'*r)/(p'*A*p);
        x0 = x0 + alpha*p   ;
        r1 =  r + alpha*A*p ;
      beta = (r1'*r1)/(r'*r);
         p = -r1 + beta*p   ;
         r = r1;
         n = n+1;
end
time =  cputime - t;

五、雅克比迭代法

      考虑线性方程组Ax = b时,一般当A为低阶稠密矩阵时,用主元消去法解此方程组是有效方法。但是,对于由工程技术中产生的大型稀疏矩阵方程组(A的阶数很高,但零元素较多,例如求某些偏微分方程数值解所产生的线性方程组),利用迭代法求解此方程组就是合适的,在计算机内存和运算两方面,迭代法通常都可利用A中有大量零元素的特点。雅克比迭代法就是众多迭代法中比较早且较简单的一种,其命名也是为纪念普鲁士著名数学家雅可比。MATLAB代码如下:

A = [2 0 2 7 
     7 7 1  3
     3 8 2  0
     2 7 7 7];
 b  = [1;3;3;8];
 x0=[0 0 0 0]';

    eps= 1.0e-6;
    M  = 1000;

D=diag(diag(A));    %求A的对角矩阵
L=-tril(A,-1);      %求A的下三角阵
U=-triu(A,1);       %求A的上三角阵
B=D\(L+U);
f=D\b;
x=B*x0+f;
n=0;                  %迭代次数
while norm(x-x0)>=eps
    x0=x;
     x=B*x0+f;
    n=n+1;
    if(n>=M)
        disp('Warning: 迭代次数太多,可能不收敛!');
        return;
    end
    x
end

六、超松弛迭代法

    一般而言,因雅可比迭代收敛速度不够快,所以在工程中应用不多。并且在雅可比迭代收敛速

度很慢的情况下,通常高斯-赛德尔方法也不会很快。我们可以对高斯-赛德尔方法做出一定的

修改,来提高收敛速度。我们介绍超松弛迭代法可以提高收敛速度,MATLAB代码如下

clc
clear
close all
DIM=4;
A=10*rand(DIM);% A元素是0-100
for i=1:DIM
    A(i,i)=sum(abs(A(i,:)))+25*rand(1); %对角占优的量为0~25
end
b=zeros(DIM,1);
x0=[10 10 10 10]';
w=1.025;
tol = 10^-10;
D=diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
B = (D - w * L) \ ((1 - w) * D + w * U);
g = (D - w * L) \ b * w;
x = B * x0 +g;
n=1;
while norm(x - x0) >= tol
    x0 = x;
    x= B * x0 + g;
    n = n + 1;
end

七、粒子群算法

        直接发和迭代法,都有一定的适用范围,对应复杂的方程组,往往没法收敛,启发式算法,比如粒子群,可以自适应的对方程组的解进行求解,对复杂的方程组的求解精度一般更高,代码通用性更强,PSO是由Kennedy和Eberhart共同提出,最初用于模拟社会行为,作为鸟群或鱼群中有机体运动的形式化表示。自然界中各种生物体均具有一定的群体行为,Kennedy和Eberhart的主要研究方向之一是探索自然界生物的群体行为,从而在计算机上构建其群体模型。PSO是一种元启发式算法,因为它很少或没有对被优化的问题作出假设,并且能够对非常大候选解决方案空间进行搜索,算法的主要参数包括,最大迭代次数,种群个数,学习因子,权重因子,种群位置,种群速度,个体最优解,全局最优解,MATLAB代码如下

clc
clear
close all
format long
warning off
set(0,'defaultfigurecolor','w') 

xmax = [100 6 ];
xmin = [60 2 ];
vmax = 0.1*xmax;
vmin = -vmax;

m=2;
%程序初始化
% global popsize;     %种群规模
gen=10;     %设置进化代数
popsize=300;     %设置种群规模大小
best_in_history(gen)=inf;   %初始化全局历史最优解
best_in_history(:)=inf;   %初始化全局历史最优解
best_fitness=inf;
fz = zeros(gen,5);
%设置种群数量

pop1 = zeros(popsize,m);
pop2 = zeros(popsize,m);
pop3 = zeros(popsize,m);
pop6 = zeros(gen,m);%存储解码后的每代最优粒子
pop7 = zeros(popsize,m);%存储更新解码后的粒子的位置
pop8=zeros(popsize,5);%保存
for ii1=1:popsize
    pop1(ii1,:)=funx(xmin,xmax,m);   %初始化种群中的粒子位置,
    pop3(ii1,:)=pop1(ii1,:);  %初始状态下个体最优值等于初始位置
    pop2(ii1,:)=funv(vmax,m);    %初始化种群微粒速度,
    pop4(ii1,1)=inf;
    pop5(ii1,1)=inf;
end
pop0=pop1;

c1=2;
c2=2;

gbest_x=pop1(end,:);
% pop1(1:size(num,1),:) = num;   %全局最优初始值为种群第一个粒子的位置

for exetime=1:gen
    
    ww = 0.7*(gen-exetime)/gen+0.2;
    for ii4=1:popsize
        
        pop2(ii4,:)=(ww*pop2(ii4,:)+c1*rand(1,m).*(pop3(ii4,:)-pop1(ii4,:))+c2*rand(1,m).*(gbest_x-pop1(ii4,:)));    %更新速度
        for jj = 1:m
            if  pop2(ii4,jj)<vmin(jj)
                pop2(ii4,jj)=vmin(jj);
            elseif pop2(ii4,jj)>vmax(jj)
                pop2(ii4,jj)=vmax(jj);
            end
        end
    end
    %更新粒子位置
    for ii5=1:popsize
        pop1(ii5,:)=pop1(ii5,:)+pop2(ii5,:);
        for jj2 = 1:m
            if  pop1(ii5,jj2)>xmax(jj2)
                pop1(ii5,jj2) = xmax(jj2);
            elseif pop1(ii5,jj2)<xmin(jj2)
                pop1(ii5,jj2)=xmin(jj2);
            end
        end
        
%         if  rand>0.85
%             k=ceil(m*rand);
%             pop1(ii5,k) = (xmax( k)-xmin(k)).*rand(1,1)+xmin(k);
%         end
%         if  pop5(ii5)>sum(pop5)/popsize
%             pop1(ii5,:) = (xmax(1,m)-xmin(1,m)).*rand(1,m)+xmin(1,m);
%         end
    end
    for jj2 = 1:m
        if  pop1(ii5,jj2)>xmax(jj2)
            pop1(ii5,jj2) = xmax(jj2);
        elseif pop1(ii5,jj2)<xmin(jj2)
            pop1(ii5,jj2)=xmin(jj2);
        end
    end
    if  exetime-1>0
        plot(1:length(best_in_history(1:exetime-1)),best_in_history(1:exetime-1),'b-','LineWidth',1.5);
        xlabel('迭代次数')
        ylabel('适应度')
        title('粒子群算法')
        hold on;
        pause(0.1)
    end
    
    pop1(end,:) = gbest_x;
    %计算适应值并赋值
    for ii3=1:popsize
        [my,mx,ff] = fun2(pop1(ii3,:));
        %          [my,mx] = fun2(gbest_x,num,xmax,xmin);
        pop5(ii3,1)=my;
        pop7(ii3,:) = mx;
        pop8(ii3,:) = ff;
        if  pop4(ii3,1)>pop5(ii3,1)    %若当前适应值优于个体最优值,则进行个体最优信息的更新
            pop4(ii3,1)=pop5(ii3,1);          %适值更新
            pop3(ii3,:)=pop1(ii3,:);      %位置坐标更新
        end
    end
    
    %计算完适应值后寻找当前全局最优位置并记录其坐标
    if  best_fitness>min(pop4(:,1))
        best_fitness=min(pop4(:,1))  ;  %全局最优值
        ag = [];
        ag =find(pop4(:,1)==min(pop4(:,1)));
        
        gbest_x(1,:)=(pop1(ag(1),:));    %全局最优粒子的位置
        fz(exetime,:) = pop8(ag(1),:);
        pop6(exetime,:) = pop7(ag(1),:);
    else
        fz(exetime,:) = fz(exetime-1,:);
        if exetime>1
            pop6(exetime,:) = pop6(exetime-1,:);
        end
    end
    best_in_history(exetime)=best_fitness;  %记录当前全局最优
    
end
figure
plot(pop0(:,1),pop0(:,2),'k*')
xlabel('X')
ylabel('Y')
title('初始种群')
set(gca,'fontsize',12)
% load maydata.mat 


figure
plot(pop1(:,1),pop1(:,2),'k*')
xlabel('X')
ylabel('Y')
title('收敛后的种群')
set(gca,'fontsize',12)
[X,Y] = meshgrid(60:100,2:0.05:6);
Z = -29310 + 1621*X -473.5*Y -31.7*X.^2 + 21.63*X.*Y + 0.2722*X.^3 -0.3143*X.^2.*Y -0.0008683*X.^4 + 0.001494*X.^3.*Y;

x1 = pop0(:,1);
y1 = pop0(:,2);
f21 =   -29310 + 1621*x1  -473.5*y1  -31.7*x1.^2    + 21.63*x1.*y1  + 0.2722*x1.^3   -0.3143*x1.^2.*y1    -0.0008683*x1.^4    +0.001494*x1.^3.*y1;

x2 = pop1(:,1);
y2 = pop1(:,2);
f22 =   -29310 + 1621*x2  -473.5*y2  -31.7*x2.^2    + 21.63*x2.*y2  + 0.2722*x2.^3   -0.3143*x2.^2.*y2    -0.0008683*x2.^4    +0.001494*x2.^3.*y2;

[X,Y] = meshgrid(60:100,2:0.05:6);
Z2 =      190 - 12.1*X - 16.61*Y + 0.3042*X.^2   + 0.8998*X.*Y -0.003729*X.^3    -0.01836*X.^2.*Y   +0.00002218*X.^4  + 0.0001653*X.^3.*Y  - 0.0000000509*X.^5   - 0.0000005522*X.^4.*Y;
x1 = pop0(:,1);
y1 = pop0(:,2);
f23 =   190 - 12.1*x1 - 16.61*y1 + 0.3042*x1.^2 + 0.8998*x1.*y1 -0.003729*x1.^3 -0.01836*x1.^2.*y1 +0.00002218*x1.^4 + 0.0001653*x1.^3.*y1 - 0.0000000509*x1.^5 - 0.0000005522*x1.^4.*y1;
x2 = pop1(:,1);
y2 = pop1(:,2);
f24 =   190 - 12.1*x2 - 16.61*y2 + 0.3042*x2.^2 + 0.8998*x2.*y2 -0.003729*x2.^3 -0.01836*x2.^2.*y2 +0.00002218*x2.^4 + 0.0001653*x2.^3.*y2 - 0.0000000509*x2.^5 - 0.0000005522*x2.^4.*y2;

[X,Y] = meshgrid(60:100,2:0.05:6);
Z3 =    3.327 +  0.2373*X -0.5549*Y -0.01062*X.^2 + 0.02165*X.*Y + 0.0001393*X.^3 -0.0003284*X.^2.*Y -0.0000005832*X.^4 + 0.000001639*X.^3.*Y;
x1 = pop0(:,1);
y1 = pop0(:,2);
f25 =   3.327 +  0.2373*x1 -0.5549*y1 -0.01062*x1.^2 + 0.02165*x1.*y1 + 0.0001393*x1.^3 -0.0003284*x1.^2.*y1 -0.0000005832*x1.^4 + 0.000001639*x1.^3.*y1;
x2 = pop1(:,1);
y2 = pop1(:,2);
f26 =   3.327 +  0.2373*x2 -0.5549*y2 -0.01062*x2.^2 + 0.02165*x2.*y2 + 0.0001393*x2.^3 -0.0003284*x2.^2.*y2 -0.0000005832*x2.^4 + 0.000001639*x2.^3.*y2;

[X,Y] = meshgrid(60:100,2:0.05:6);
Z4 =     22680 -1634*X -3160*Y + 46.03*X.^2 +159.3*X.*Y -0.6327*X.^3 -2.965*X.^2.*Y +0.004249*X.^4 +0.02432*X.^3.*Y -0.00001116*X.^5 - 0.00007448*X.^4.*Y;
x1 = pop0(:,1);
y1 = pop0(:,2);
f27 =   22680 -1634*x1 -3160*y1 + 46.03*x1.^2 +159.3*x1.*y1 -0.6327*x1.^3 -2.965*x1.^2.*y1 +0.004249*x1.^4 +0.02432*x1.^3.*y1 -0.00001116*x1.^5 - 0.00007448*x1.^4.*y1;
x2 = pop1(:,1);
y2 = pop1(:,2);
f28 =  22680-1634*x2 -3160*y2 + 46.03*x2.^2 +159.3*x2.*y2 -0.6327*x2.^3 -2.965*x2.^2.*y2 +0.004249*x2.^4 +0.02432*x2.^3.*y2 -0.00001116*x2.^5 - 0.00007448*x2.^4.*y2;
[X,Y] = meshgrid(60:100,2:0.05:6);
Z5 =     -46.14 +2.441*X + 0.2536*Y   -0.04762*X.^2   -0.007813*X.*Y   + 0.0004074*X.^3  + 0.00009046*X.^2.*Y   -0.000001289*X.^4  -0.0000003687*X.^3.*Y;
x1 = pop0(:,1);
y1 = pop0(:,2);
f29 =   -46.14  +2.441*x1 + 0.2536*y1 -0.04762*x1.^2  -0.007813*x1.*y1 + 0.0004074*x1.^3 + 0.00009046*x1.^2.*y1 -0.000001289*x1.^4 -0.0000003687*x1.^3.*y1;
x2 = pop1(:,1);
y2 = pop1(:,2);
f30 =   -46.14  +2.441*x2 + 0.2536*y2 -0.04762*x2.^2  -0.007813*x2.*y2 + 0.0004074*x2.^3 + 0.00009046*x2.^2.*y2 -0.000001289*x2.^4 -0.0000003687*x2.^3.*y2;
figure
surf(X,Y,Z)
hold on
shading interp
plot3(x1,y1,f21,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('切削面积_5(cm^2)')
title('初始种群')
set(gca,'fontsize',12)

figure
surf(X,Y,Z)
shading interp
hold on
plot3(x2,y2,f22,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('应力峰值S_5(Mpa)')
title('收敛后的种群')
set(gca,'fontsize',12)
figure
surf(X,Y,Z2)
hold on
shading interp
plot3(x1,y1,f23,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('载荷波动系数\delta_5')
title('初始种群')
set(gca,'fontsize',12)

figure
surf(X,Y,Z2)
shading interp
hold on
plot3(x2,y2,f24,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('载荷波动系数\delta_5')
title('收敛后的种群')
set(gca,'fontsize',12)
figure
surf(X,Y,Z3)
hold on
shading interp
plot3(x1,y1,f25,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('截割比能耗H_w_5(kW·h/m^3)')
title('初始种群')
set(gca,'fontsize',12)

figure
surf(X,Y,Z3)
shading interp
hold on
plot3(x2,y2,f26,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('截割比能耗H_w_5(kW·h/m^3)')
title('收敛后的种群')
set(gca,'fontsize',12)
figure
surf(X,Y,Z4)
hold on
shading interp
plot3(x1,y1,f27,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('载荷峰值Q_s_5(kN/m)')
title('初始种群')
set(gca,'fontsize',12)

figure
surf(X,Y,Z4)
shading interp
hold on
plot3(x2,y2,f28,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('滚筒负载Q_s_5(×10^4N/m)')
title('收敛后的种群')
set(gca,'fontsize',12)
figure
surf(X,Y,Z5)
hold on
shading interp
plot3(x1,y1,f29,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('装煤率\eta_5(%)')
title('初始种群')
set(gca,'fontsize',12)

figure
surf(X,Y,Z5)
shading interp
hold on
plot3(x2,y2,f30,'ro','MarkerFaceColor','r')
xlabel('转速n(r/min)')
ylabel('牵引速度v_q(m/min)')
zlabel('装煤率\eta_5(%)')
title('收敛后的种群')
set(gca,'fontsize',12)
[f,mx,ff,ff1] = fun3(gbest_x);

figure
for ii = 1
    plot(fz(:,ii),'k-o','LineWidth',1.5)
    hold on
end
xlabel('迭代次数')
ylabel('装煤率\eta_5适应度')
set(gca,'fontsize',12)
xlim([1 9])

figure
for ii = 2
    plot (fz(:,ii),'r-o','LineWidth',1.5)
    hold on
end
xlabel('迭代次数')
ylabel('切削面积S_5适应度')
set(gca,'fontsize',12)
xlim([1 9])

figure
for ii = 3
    plot(fz(:,ii),'b-o','LineWidth',1.5)
    hold on
end
xlabel('迭代次数')
ylabel('载荷波动系数\delta_5适应度')
set(gca,'fontsize',12)
xlim([1 9])


figure
for ii = 4
    plot(fz(:,ii),'g-o','LineWidth',1.5)
    hold on
end
xlabel('迭代次数')
ylabel('滚筒负载Q_s_5适应度')
set(gca,'fontsize',12)
xlim([1 9])


figure
for ii = 5
    plot(fz(:,ii),'m-o','LineWidth',1.5)
    hold on
end
xlabel('迭代次数')
ylabel('截割比能耗H_w_5适应度')
set(gca,'fontsize',12)
xlim([1 9])

基于粒子群的复杂方程组求解-机器学习文档类资源-CSDN文库  https://download.csdn.net/download/abc991835105/86962101

 

八、遗传算法

          遗传算法的基本运算过程如下:

(1)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。 

(2)个体评价:计算群体P(t)中各个个体的适应度。 

(3)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。 

(4)交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。 

(5)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。 

(6)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。  

遗传操作包括以下三个基本遗传算子(genetic operator):选择(selection);交叉(crossover);变异(mutation)。

matlab代码如下:

clc
clear
close all

Size=300; %种群规模
G=50;      %最大迭代次数   
CodeL=10; %染色体长度
dim = 4;
umax=[30 30 30 30]; %上限
umin=[-30 -30 -30 -30]; %下限
E=round(rand(Size,dim*CodeL));    %种群初始化
zbestf = 0;

bfi= zeros(G,1);
bfi(1) = 200;
%主循环
for k=1:1:G 
time(k)=k; 
[F,x1,x2,x3,x4] = fun(E,umax,umin,Size); 
%****** Step 1 : Evaluate BestJ ****** 
fi=F;                          %适应度值
[Oderfi,Indexfi]=sort(fi);     %排序
Bestfi=Oderfi(Size);           %最大值
BestS=E(Indexfi(Size),:);      %最优染色体
bfi(k)=Bestfi;
if zbestf<Bestfi
    zbestf = Bestfi;
    zbest = BestS;
end
 
%****** Step 2 : 选择****** 
   fi_sum=sum(fi); 
   fi_Size=(Oderfi/fi_sum)*Size; 
    
   fi_S=floor(fi_Size);        %被选择概率
    
   kk=1; 
   for ii=1:1:Size 
      for jj=1:1:fi_S(ii)       
          TempE(kk,:)=E(Indexfi(ii),:);   
          kk=kk+1;             
      end 
   end 
    
%************ Step 3 : 交叉 ************ 
pc=0.60; %交叉概率
n=ceil(CodeL*rand); 
for ii=1:2:(Size-1) 
                    
    for jj=n:1:dim*CodeL
        temp=rand; 
        if pc>temp 
           TempE(ii,jj)=E(ii+1,jj); 
           TempE(ii+1,jj)=E(ii,jj); 
        end 
    end 
end 
TempE(Size,:)=BestS; 
E=TempE; 
    
%************ Step 4: 变异 ************** 

pm=0.8;     %变异概率
 
for ii=1:1:Size 
    mx = round((dim*CodeL-1)*rand()+1);
    my = randperm(dim*CodeL);
    temp=rand; 
    if pm>temp                %
        for jj = 1:mx
            if TempE(ii,jj)==0 
               TempE(ii,jj)=1; 
            else 
               TempE(ii,jj)=0; 
            end 
        end 
    end 
end 
    

TempE(Size,:)=BestS; 
E=TempE; 
end 
zbfi = bfi(1);
for ii = 2:size(bfi)
    if zbfi(ii-1)<=bfi(ii)
       zbfi = [zbfi bfi(ii)];
    elseif  zbfi(ii-1)>bfi(ii)
       zbfi = [zbfi zbfi(ii-1)];
    end
end
[F,xx1,xx2,x3,x4] = fun(zbest,umax,umin,1);   
zbest
Mmin_Value=1./zbestf 
gbest_x = [xx1 xx2 x3 x4]
figure(2); 
plot(time,1./zbfi); 
xlabel('迭代次数');
ylabel(' Rosenbrock');
title('遗传算法')

x1 = -30:30;
x2 = -30:30;
[x,y] = meshgrid(x1,x2);
f = zeros(61,61);
for ii = 1:61
    for jj = 1:61
        f(ii,jj) = sum((x(ii,jj)-y(ii,jj)).^2)+sum(([x(ii,jj) y(ii,jj)]-1).^2);
    end
end
figure
surf(x,y,f)
shading interp
hold on
plot3(xx1,xx2,Mmin_Value,'ro')
hold off
xlabel('x')
ylabel('y')
zlabel('Rosenbrock')
title('遗传算法')

基于MATLAB的遗传算法求解方程组-机器学习文档类资源-CSDN文库  https://download.csdn.net/download/abc991835105/86966265

九、鲸鱼算法

       鲸鱼算法是一种模仿鲸鱼捕食行为产生的算法,鲸鱼是一种群组哺乳海洋动物,常常通过群体合作对猎物进行围捕和捕猎,鲸鱼算法是一种比较新的算法,应用相对其他算法要稍很多,比灰狼算法还要晚些,MATALB代码如下:

clc
clear
close all
load maydata.mat
xa = ax;
SearchAgents_no=3; % 变量维数
Function_name='goal_function'; % 适应度函数
Max_iteration=100; %最大迭代次数
lb = [-5 -5 95];
ub = [5 5 105];
dim = 3;
[Best_score,Best_pos,WOA_cg_curve]=WOA(SearchAgents_no,Max_iteration,lb,ub,dim,xa);
theta = 0:pi/100:10*pi;
x1 = Best_pos(1)*theta.*cos(theta);
y1 = Best_pos(1)*theta.*sin(theta);
z1 = Best_pos(2)*theta+Best_pos(3);
figure
plot3(xa(:,1),xa(:,2),xa(:,3),'bo')
hold on
plot3(x1,y1,z1,'r-')
hold off
xlabel('x')
ylabel('y')
zlabel('z')
legend('实际散点','鲸鱼算法拟合曲线')


figure
semilogy(WOA_cg_curve,'Color','r')
title('WOA')
xlabel('迭代次数');
ylabel('目标函数值');
axis tight
grid on
box on

基于MATLAB的鲸鱼算法多目标优化,基于MATLAB的鲸鱼算法多方程组求解-机器学习文档类资源-CSDN文库  https://download.csdn.net/download/abc991835105/86966822

十、BP神经网络算法

BP神经网络算法是模仿人类神经元开发出来的算法,是较早更成熟的一种基础机器学习算法,算法结构简单,但是发展很完善,适用性和实用性很强,工具箱强大完善,可以处理解决很多问题,MATALB求解方程组的解代码如下;

clc
clear
close all
%% 训练数据预测数据提取及归一化

%找出训练数据和预测数据
input_train=[2 0 2 7
             7 7 1 3
             3 8 2 0
             2 7 7 7]';
output_train=[-11 -18 -13 -23];
input_test=input_train;
output_test=output_train;

%选连样本输入输出数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%% 网络结构初始化
innum=4;
midnum=4;
outnum=1;
%权值初始化
w1=rands(midnum,innum);
b1=rands(midnum,1);
w2=rands(midnum,outnum);
b2=rands(outnum,1);

w2_1=w2;w2_2=w2_1;
w1_1=w1;w1_2=w1_1;
b1_1=b1;b1_2=b1_1;
b2_1=b2;b2_2=b2_1;

%学习率
xite=0.1;
alfa=0.01;
loopNumber=200;
I=zeros(1,midnum);
Iout=zeros(1,midnum);
FI=zeros(1,midnum);
dw1=zeros(innum,midnum);
db1=zeros(1,midnum);

%% 网络训练
E=zeros(1,loopNumber);
for ii=1:loopNumber
    E(ii)=0;
    for i=1:1:4
       %% 网络预测输出 
        x=inputn(:,i);
        % 隐含层输出
        for j=1:1:midnum
            I(j)=inputn(:,i)'*w1(j,:)'+b1(j);
            Iout(j)=1/(1+exp(-I(j)));
        end
        % 输出层输出
        yn=w2'*Iout'+b2;
        
       %% 权值阀值修正
        %计算误差
        e=output_train(:,i)-yn;     
        E(ii)=E(ii)+sum(abs(e));
        
        %计算权值变化率
        dw2=e*Iout;
        db2=e';
        
        for j=1:1:midnum
            S=1/(1+exp(-I(j)));
            FI(j)=S*(1-S);
        end      
        for k=1:1:innum
            for j=1:1:midnum
                dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1));
                db1(j)=FI(j)*(e(1)*w2(j,1));
            end
        end
           
        w1=w1_1+xite*dw1';
        b1=b1_1+xite*db1';
        w2=w2_1+xite*dw2';
        b2=b2_1+xite*db2';
        
        w1_2=w1_1;w1_1=w1;
        w2_2=w2_1;w2_1=w2;
        b1_2=b1_1;b1_1=b1;
        b2_2=b2_1;b2_1=b2;
    end
end

inputn_test=mapminmax('apply',input_test,inputps);
answer=zeros(4,1);
for ii=1:1
    for i=1:1:4
        for j=1:1:midnum
            I(j)=inputn_test(:,i)'*w1(j,:)'+b1(j);
            Iout(j)=1/(1+exp(-I(j)));
        end
        answer(i,:)=w2'*Iout'+b2;
          
    end
end


%% 结果分析
  BPoutput=  answer;
figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%预测误差
error=BPoutput-output_test';


figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)

figure(3)
plot((output_test-BPoutput')./BPoutput','-*');
title('神经网络预测误差百分比')

errorsum=sum(abs(er
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10种基于MATLAB的方程组求解方法 的相关文章

  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • 图像堆栈的最大强度投影

    我正在尝试重新创建该功能 max array 3 来自 MatLab 它可以获取 N 个图像的 300x300px 图像堆栈 我在这里说 图像 因为我正在处理图像 实际上这只是一个大的双数组 300x300xN 并创建一个 300x300
  • 按元素出现的频率对数组元素进行排序

    是否可以在 matlab octave 中使用sort函数根据元素的相对频率对数组进行排序 例如数组 m 4 4 4 10 10 10 4 4 5 应该产生这个数组 5 10 10 10 4 4 4 4 4 5是出现频率较低的元素 位于顶部
  • 将自动生成的 Matlab 文档导出为 html

    我想为我开发的 Matlab 工具箱生成完整的帮助 我已经看到如何显示自定义文档 http www mathworks fr fr help matlab matlab prog display custom documentation h
  • 如何使用matlab生成不同频率的正弦波?

    对于我的项目 我需要使用 matlab 生成一个正弦波 它有 100 000 个样本 并且频率在每 10 000 个样本后随机变化 采样率和频率可以根据方便而定 matlab中有没有函数可以生成这个 好的另一个例子 生成 5 个随机频率 r
  • 为什么旋转 3D 点云后顶点法线会翻转?

    我有两个人脸 3D 点云样本 蓝色点云表示目标面 红色点云表示模板 下图显示目标面和模板面在不同方向上对齐 目标面大致沿 x 轴 模板面大致沿 y 轴 Figure 1 The region around the nose is displ
  • 如何在没有安装Visual Studio的另一台机器上使用Visual Studio生成的dll?

    我已经在 Visual Studio 2012 中生成了动态库 我想在另一台机器上使用该库 但我不想在远程机器上安装 Visual Studio 我有 mex 库和 dll 我想运行一个使用这两个库的脚本 当我运行脚本时 出现以下错误 缺少
  • Matlab 和 Python 中的优化算法(dog-leg trust-region)

    我正在尝试使用 Matlab 和 Python 中的狗腿信赖域算法求解一组非线性方程 在Matlab中有fsolve https www mathworks com help optim ug fsolve html其中此算法是默认算法 而
  • 我需要转义该 MATLAB 字符串中的字符吗?

    我想在 MATLAB 中调用以下 bash 命令 grep Up to test linux vision1 1 log awk print 7 I use system 在MATLAB中 但结果有错误 gt gt status strin
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • MATLAB - 冲浪图数据结构

    我用两种不同的方法进行了计算 对于这些计算 我改变了 2 个参数 x 和 y 最后 我计算了每种变体的两种方法之间的 误差 现在我想根据结果创建 3D 曲面图 x gt on x axis y gt on y axis Error gt o
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得
  • 从开始/结束索引列表创建向量化数组

    我有一个两列矩阵M包含一堆间隔的开始 结束索引 startInd EndInd 1 3 6 10 12 12 15 16 如何生成所有区间索引的向量 v 1 2 3 6 7 8 9 10 12 15 16 我正在使用循环执行上述操作 但我想
  • 图像处理 - 使用 opencv 进行服装分割

    我正在使用 opencv 进行服装特征识别 第一步 我需要通过从图像中移除脸部和手来分割 T 恤 任何建议表示赞赏 我建议采用以下方法 Use 阿德里安 罗斯布鲁克的用于检测皮肤的皮肤检测算法 谢谢罗莎 格隆奇以获得他的评论 在方差图上使用
  • Matlab 的 imresize 函数中用于插值的算法是什么?

    我正在使用 Matlab Octaveimresize 对给定的二维数组重新采样的函数 我想了解如何使用特定的插值算法imresize works 我在Windows上使用八度 e g A 1 2 3 4 是一个二维数组 然后我使用命令 b

随机推荐

  • 使用Typora将Markdown内容导出为Word(.docx)

    使用Typora将Markdown内容导出为Word docx 操作步骤 01 下载并安装Typora 自行前往Typora官网下载 傻瓜式安装 此处就不再做多余的解释 02 安装Pandoc 2 1 pandoc官网下载 真不知道怎么从这
  • Mongodb 定义model中的某个属性 保存任意类型

    参考 Mongoose5 0 文档http www mongoosejs net docs schematypes html 一个啥都可以放的 SchemaType 虽然便利 但也会让数据难以维护 Mixed 可以通过 Schema Typ
  • Spring @Scheduled @Async联合实现调度任务

    定时任务之前一直用的是quartz之类 但是注意到Spring中其实也提供了一种简单的调度注释 Scheduled 也就想尝一下鲜 代码示意如下 Component EnableScheduling public class AsyncTa
  • C++ primer plus 第六版 第十一章 复习题

    第十一章 复习题 1 Stonewt Stonewt operator double n const Stonewt result double total stn Lbs per stn n lbs n result stn total
  • RabbitMQ(三)手动Ack确认

    默认情况下 spring boot data amqp 是自动ACK机制 就意味着 MQ 会在消息发送完毕后 自动帮我们去ACK 然后删除消息的信息 这样依赖就存在这样一个问题 如果消费者处理消息需要较长时间 最好的做法是消费端处理完之后手
  • javascript enval()函数与JSON 之间关系

    概念定义 eval 函数可计算某个字符串 并执行其中的的 JavaScript 代码 enval 函数将把最后一个表达式或者语句所包含的值或引用作为返回值 举例说明一 eval javascrit表达式
  • 关于召开“CIE2019第三届中国IT教育论坛”的通知

    各相关高校 伴随着人工智能 智能制造 云计算 虚拟现实 5G等新技术的发展与日益成熟 全球范围内的新科技革命悄然打响 新一轮科技革命正在重塑世界竞争格局 以新技术 新业态 新产业为特点的新经济蓬勃发展 我国急需培养一批集学科 技术和产业思维
  • ubuntu18.04下mysql数据库安装和C语言连接操作

    数据库在应用系统开发中很常见 在众多的数据库中 mysql总是会占有一席之地 本篇说明一下如何在ubuntu18 04上安装mysql数据库 目录 1 更新环境 2 安装mysql数据库系统 3 检测是否安装成功 4 启动 重启 关闭 删除
  • CLion用于STM32开发

    最近想要复现稚晖君的ElectronBot 发现32的代码用的CLion编写的 而且是C和C 混编的 本来想着用keil再写一个 但是有点浪费时间 而且发现CLion学生可以白嫖 反正以后都要学习C 所以现在就装上吧 注 最终的效果只能下载
  • 克服过拟合和提高泛化能力的20条技巧和诀窍

    克服过拟合和提高泛化能力的20条技巧和诀窍 你是如何提升深度学习模型的效果 这是我经常被问到的一个问题 有时候也会换一种问法 我该如何提高模型的准确率呢 或者反过来问 如果我的网络模型效果不好 我该怎么办 通常我的回答是 具体原因我不清楚
  • 数据结构——查找

    一 查找的基本概念 查找 在数据集合中寻找满足某种条件的数据元素的过程称为查找 查找表 查找结构 用于查找的数据集合称为查找表 它由同一类型的数据元素 或记录 组成 关键字 数据元素中唯一标识该元素的某个数据项的值 使用基于关键字的查找 查
  • 智能合约安全分析,假充值攻击如何突破交易所的防御?

    智能合约安全分析 假充值攻击如何突破交易所的防御 引言 假充值攻击 是指攻击者通过利用交易所在处理充值过程中的漏洞或系统错误 发送伪造的交易信息到交易所钱包地址 这些伪造的交易信息被交易所误认为是真实的充值请求 并将对应的数字资产或货币添加
  • javascript判断数组和对象中是否存在某元素

    javascript判断数组和对象中是否存在某元素 判断数组 是否存在某个元素 可以用数组的indexOf函数 方法arr indexOf find start find 要找的内容 必须 start 查找开始下标 可选 返回 查找数据所在
  • 【Python】os.path.expanduser() 函数的理解和举例说明

    文章目录 一 函数说明 二 实例说明 一 函数说明 os path expanduser 是 Python 中 os path 模块中的一个函数 用于将路径字符串中的波浪线 扩展为用户的主目录 它的作用是提供跨平台的路径展开功能 使得路径可
  • HTML入门

    web前端 前端开发也叫web前端开发 它指的是基于web的互联网产品的页面 也可叫做界面 开发及功能开发 1 认识HTML HTML是Hyper Text Markup Language 超文本标记语言 的缩写 是构成web页面的基本元素
  • git clone 出现fatal: unable to access ‘https://github.com/xxx: Failed to connect to github.com

    问题描述 使用git clone命令时 出现如下错误 fatal unable to access https github com xxx Failed to connect to github com port 443 Timed ou
  • 多版本 Python 使用 pip 安装 package

    最简单的方式 使用参数指定安装路径 pip install t D python3 5 32bit Lib site packages numpy 叨叨叨 如果电脑上安装了多个版本的Python的话 在需要使用pip安装新package时
  • hive分区表的元数据信息numRows显示为0

    创建分区表 CREATE TABLE dept partition deptno int dname string loc string PARTITIONED BY
  • 2023牛客暑期多校训练营3

    A World Fragments I 将两个二进制数先转换成十进制数 因为只要二进制中有1 就加或减1 加减0是没有用的 所以求两个二进制的差的绝对值 这是在有1的情况下 其实只要不等于0就有1 数是非负整数 所以需要特判 如果第一个二进
  • 10种基于MATLAB的方程组求解方法

    线性方程组的求解包括直接法和迭代法 其中迭代法包括传统的高斯消元法 最速下降法 牛顿法 雅克比迭代法 共轭梯度法 以及智能启发式算法求解法和神经网络学习算法 传统算法可以相互组合改进 智能仿生启发式算法包括粒子群算法 遗传算法 模拟退火算法