一、算法流程
库伦定律(Coulomb's law)是静止点电荷相互作用力的规律,由法国科学家 C,-A.de库伦经实验得出。在物理学中,带电物体周围的空间会产生一个电场,对其他带电物体施加一个力。根据库仑定律,真空中两个静止的电荷之间的相互作用力,与它们的电荷量的乘积成正比,与它们的距离的二次方成反比,作用力的方向在它们的连线上。
电力大小为
人工电场算法(AEFA)受库仑定律的启发,通过模拟带电粒子在静电场的运动,将其演化成随机搜索最优解的过程。电荷在静电力的作用下相互吸引或排斥,使电荷能在搜索空间中移动。在 AEFA 算法中,仅考虑电荷的吸引力,而忽略电荷的排斥力,因而电荷量大的带电粒子能吸引所有其他电荷量较低的粒子向其靠近。
在搜索空间中,每一个电荷代表一个可行解,其强度由他们的电荷量来衡量,电荷的电荷量越大,表明该电荷越接近理论最优解。电荷面积的大小表示该电荷量的大小,电荷分别受到其它三个电荷的吸引力,根据运动定律,形成一个合力F和该方向的加速度。由于电荷Q的电荷量最大,其吸引力也越大,电荷9合力F的方向更接近g与Q之间的中心连线。因此,AEFA算法通过模拟电荷间的相互作用力,当搜索空间存在电荷量大的电荷时,其它电荷都向电荷量大的方向靠近,使算法收敛到最优解。
库仑力
算法流程
二、代码与仿真
hold on;
density = 100;
sx = (0:density)*2/density-1;
sy = f(sx);
plot(sx,sy);
coeff_leg = myLegendreSquareApprox(@f);
fprintf("Legendre: %fx^3+%fx^2+%fx+%f\n", coeff_leg(4), coeff_leg(3), coeff_leg(2), coeff_leg(1));
[sx, sy] = sampleFunction([-1,1], coeff_leg, density);
plot(sx,sy);
% plot(sx,f(sx)-sy);
fprintf("Legendre error: %f\n", compute_error(sx,sy))
fprintf("Legendre l2 error: %f\n", compute_l2_error(@f, @(x)(coeff_leg(1)+coeff_leg(2).*x+coeff_leg(3).*x.^2+coeff_leg(4).*x.^3), @(x)(1)));
coeff_tche = myTchebychevUniformApprox(@f);
fprintf("Tchebychev: %fx^3+%fx^2+%fx+%f\n", coeff_tche(4), coeff_tche(3), coeff_tche(2), coeff_tche(1));
[sx, sy] = sampleFunction([-1,1], coeff_tche, density);
plot(sx,sy);
% plot(sx,f(sx)-sy);
fprintf("Tchebychev error: %f\n", compute_error(sx,sy))
coeff_lag = myLagrangeUniformApprox(@f);
fprintf("Lagrange: %fx^3+%fx^2+%fx+%f\n", coeff_lag(4), coeff_lag(3), coeff_lag(2), coeff_lag(1));
[sx, sy] = sampleFunction([-1,1], coeff_lag, density);
plot(sx,sy);
% plot(sx,f(sx)-sy);
fprintf("Lagrange error: %f\n", compute_error(sx,sy))
lgd = legend('f','Legendre', 'Tchebychev', 'Lagrange');
lgd.Location = 'northwest';
% lgd = legend('Legendre', 'Tchebychev', 'Lagrange');
% lgd.Location = 'south';
function y=f(x)
y = (x.^2).*log(2+x);
end
function d = compute_error(sx, sy)
y = f(sx);
d = max(abs(y-sy));
end
function d = compute_l2_error(f,g,rho)
d = integral(@(x)(rho(x).*(f(x)-g(x)).^2), -1, 1)^0.5;
end
库伦常数
基准函数
基准函数
收敛情况