在matlab中使用遗传算法工具箱时,可以使用
fun=@(para)function_0(para,t_b,c_b);
向误差函数传入除了拟合参数外的其他参数。
测试脚本solution.m:
clear;
clc;tic; % 计时函数开始
%% 参数范围
% ca100属于[0,1000];k属于[0,1];
k1=[600 0];
k2=[1000 2];% 拟合数据
t_b=[100,200,300,400,500,600,700,800,900,1000];
c_b=[454,499,535,565,590,610,626,639,650,659];%% 遗传算法求解
Value=1e-3; % 设定函数误差的阈值% 遗传函数ga的调用
options=optimoptions('ga','TolFun',1e-8,'populationsize',300,'generations',2000,...
'stallgenlimit',50,'stalltimelimit',30,'ConstraintTolerance',1e-6,...
'fitnesslimit',Value,'crossoverfraction',0.85,'migrationfraction',0.2); % 设置option参数fun=@(para)function_0(para,t_b,c_b); % 为优化函数传递独立变量
[para,FVAL,exitFlag,output,population,scores] = ga(fun,2,[],[],[],[],k1,k2,[],[],options);
%% 按照拟合参数值来计算函数值,进而比较误差
ca100=para(1,1); % 赋初始值以及后续的更新值
k=para(1,2); % 赋初始值以及后续的更新值result=zeros(1,size(t_b,2));
for i=1:size(t_b,2)
cal_0=(ca100+454)/2;
cal_1=(454-ca100)/2*exp(k*(100-t_b(i))/50);
result(1,i)=cal_0+cal_1; % 计算拟合值
end%% 比较作图
figure;
plot(t_b,c_b,'or',t_b,result,'.b');
title('原始数据(红“o”)与拟合数据(蓝“.”)');
xlabel('时间点');
ylabel('B侧渗透液浓度');toc; % 计时函数结束
误差函数function_0.m:
function result=function_0(para,t_b,c_b)
%% 目标函数
ca100=para(1); % 赋初始值以及后续的更新值
k=para(2); % 赋初始值以及后续的更新值size_0=size(t_b,2); % 数据长度
temp=zeros(1,size_0);
result=zeros(1,size_0);
for i=1:size(t_b,2)
cal_0=(ca100+454)/2;
cal_1=(454-ca100)/2*exp(k*(100-t_b(i))/50);
temp(i)=cal_0+cal_1;
result(1,i)=abs(temp(i)-c_b(i)); % % 拟合值和已知值的绝对误差
end
result=sqrt(mean(result.*result)); % 误差平方和的均方根
end