fitype拟合多参数函数和遗传算法拟合多参数函数
多參數擬合函數最重要的是初始點。初始點的選擇可以靠直覺和經驗,也可以通過遺傳算法從大范圍逐步的逼近。
基本語法如下:
這是函數:z=a*(x^b)*(y^c)的函數的擬合。x,y是自變量,z是應變量,a,b,c是擬合的參數。
fit的語法是:fit(自變量,應變量,fittype的返回值,'Startpoint',參數的初始值),它的返回值是三個參數的值。
ft = fittype( @(a, b, c, x, y) a*(x.^b).*(y.^c), 'independent', {'x', 'y'},...'dependent', 'z' );fit([x(:),y(:)],z(:),ft,'Startpoint',[0.1,0.1,0.1])
以下是范例:
增加生產、發展經濟所依靠的主要因素有增加投資、增加勞動力以及技術革新等,在研究國民經濟產值與這些因素的數量關系時,由于技術水平不像資金、勞動力那樣容易定量化,作為初步的模型,可認為技術水平不變,只討論產值和資金、勞動力之間的關系。在科學技術發展不快時,如資本主義經濟發展的前期,這種模型是有意義的。
用Q,K,L分別表示產值、資金、勞動力,要尋求的數量關系Q(K,L)。經過簡化假設與分析,在經濟學中,推導出一個著名的Cobb-Douglas生產函數:
Q(K,L) = aKαLβ,? 0<α,β<1?????????? (*)
式中α,β,a要由經濟統計數據確定。現有美國馬薩諸塞州1900—1926年上述三個經濟指數的統計數據,如下表,試用數據擬合的方法,求出式(*)中的參數α,β,a。
?
表1
| ??t?????? Q???????? K???????? L | ?? t?????? Q???????? K???????? L |
| 1900??? 1.05??? ???1.04????? 1.05 1901??? 1.18?????? 1.06????? 1.08 1902??? 1.29?????? 1.16????? 1.18 1903??? 1.30?????? 1.22????? 1.22 1904??? 1.30?????? 1.27????? 1.17 1905??? 1.42?????? 1.37????? 1.30 1906??? 1.50?????? 1.44????? 1.39 1907??? 1.52?????? 1.53????? 1.47 1908??? 1.46?????? 1.57????? 1.31 1909??? 1.60?????? 2.05????? 1.43 1910??? 1.69?????? 2.51????? 1.58 1911??? 1.81?????? 2.63????? 1.59 1912??? 1.93?????? 2.74????? 1.66 1913??? 1.95?????? 2.82????? 1.68 ? ? | ?1914??? 2.01????? 3.24????? 1.65 ?1915??? 2.00????? 3.24????? 1.62 ?1916??? 2.09????? 3.61????? 1.86 ?1917??? 1.96????? 4.10????? 1.93 ?1918??? 2.20????? 4.36????? 1.96 ?1919??? 2.12????? 4.77????? 1.95 ?1920??? 2.16????? 4.75????? 1.90 ?1921??? 2.08????? 4.54????? 1.58 ?1922??? 2.24???? ?4.54????? 1.67 ?1923??? 2.56????? 4.58????? 1.82 ?1924??? 2.34????? 4.58????? 1.60 ?1925??? 2.45????? 4.58????? 1.61 ?1926??? 2.58????? 4.54????? 1.64 |
擬合代碼如下:
%lab2由4列數據組成,年份,K,L和Q4列,對應上訴表格數據。
x=lab2(:,2)';
y=lab2(:,3)';
z=lab2(:,4)';
ft = fittype( @(a, b, c, x, y) a*(x.^b).*(y.^c), 'independent', {'x', 'y'},...
???? 'dependent', 'z' );
fit([x(:),y(:)],z(:),ft,'Startpoint',[0.1,0.1,0.1])
?
二、遺傳算法擬合
%主函數%M = 20; %種群個數 C = 20000; %迭代次數 m = 2; %適應值歸一淘汰加速指數 Pmutation = 0.4; %變異概率 Pc = 0.4; %交叉概率 pop=round(rand(30,45)); %種群%%%%初始化種群及其適應函數%%%%[dePop]=decode(pop,lab3,lab2); fitness=fit(dePop); maxfitness=min(fitness); rr=find(fitness==maxfitness); R=pop(rr(1,1),:); fprintf('當前種群最優個體:%.12f\n',fitness(rr));while C>=0fprintf('迭代第%d次\n',C);%%%%選擇操作%%%%[px,py]=size(pop);ms=sort(rand(px));fitin=1;nn=1;while nn<=pxif (ms(nn))<fitness(fitin)pop_sel(nn,:)=pop(fitin,:);nn=nn+1;fitin=fitin+1;if fitin>pxfitin=floor(rand*(px-1))+1;endelsefitin=fitin+1;if fitin>pxfitin=floor(rand*(px-1))+1;endendend%%%%交叉操作%%%%nnper=randperm(M);A=pop_sel(nnper(1),:);B=pop_sel(nnper(2),:);for i=1:M*Pc[A,B]=cross(A,B);pop_sel(nnper(1),:)=A;pop_sel(nnper(2),:)=B;end%%%%變異操作%%%%for i=1:Mpick=rand;while pick==0pick=rand;endif pick<=Pmutationpop_sel(i,:)=Mutation(pop_sel(i,:),0.4);endend%%%%保留最優個體%%%%maxfitness=min(fitness);rr=find(fitness==maxfitness);pop_sel(1,:)=pop(rr(1),:);%%%%求適應度函數%%%%pop=pop_sel;[dePop]=decode(pop,lab3,lab2);fitness=fit(dePop);maxfitness=min(fitness);rr=find(fitness==maxfitness);R=-fitness(rr(1));fprintf('當前最小值=%.14f ',fitness(rr(1)));C=C-1; end plot(lab2(:,1),lab2(:,4),'b'); hold on; result=dePop(1,2)*(lab2(:,2).^dePop(1,3)).*(lab2(:,3).^dePop(1,4)); plot(lab2(:,1),result,'k');%這是fittype的擬合圖像 a1= 1.195;b1=-0.1044;c1=0.3273; plot(lab2(:,1),lab2(:,4),'b'); hold on; result=a1*(lab2(:,2).^b1).*(lab2(:,3).^c1); dePop=0; for j=1:length(lab3(:,1))dePop=dePop+(lab3(j,4)-log(a1)-b1*lab3(j,2)-c1*lab3(j,3))^2; end fprintf('fittype的擬合結果:%.14f',dePop); plot(lab2(:,1),result,'y');%解碼函數% %遺傳算法解碼 %dePop返回值包含最小二乘法的結果,以及參數α,β,a function [dePop]=decode(pop,lab3,lab2) [lengthx,~]=size(pop); dePop=zeros(lengthx,4); for i=1:lengthxa=pop(i,1:15);b=pop(i,16:30);c=pop(i,31:45);%a1是第一個參數的值,b1是第二個參數的值,c1是第三個參數的值for j=1:15if j==1a1=1^a(1);elsea1=a1+2^(2-j)*a(j);endendfor j=1:15if j==1b1=(-1)^b(1);elseb1=b1+2^(2-j)*b(j);endendfor j=1:15if j==1c1=(-1)^c(1);elsec1=c1+2^(2-j)*c(j);endend%求最小二乘法的目標的值,同時返回結果%lab3是lab2求對數的值for j=1:length(lab3(:,1))dePop(i)=dePop(i)+(lab3(j,4)-log(a1)-b1*lab3(j,2)-c1*lab3(j,3))^2;enddePop(i,2)=a1;dePop(i,3)=b1;dePop(i,4)=c1; end%適應度函數% function fitness=fit(dePop)fitness=dePop(:,1); end%交叉函數% %交叉操作 function [A,B]=cross(A,B)L=length(A);if L<10W=L;elseif((L/10)-floor(L/10))>=rand&&L>10W=ceil(L/10)+8;elseW=floor(L/10)+8;endp=unidrnd(L-W+1);for i=1:W[A(1,p+i-1),B(1,p+i-1)]=exchange(A(1,p+i-1),B(1,p+i-1));end end%染色體的局部交換函數% function [x,y]=exchange(x,y) temp=x; x=y; y=temp; end%變異函數 function a=Mutation(A,fitness)nnper=randperm(size(A,2));if (A(1,nnper(1)))==1A(1,nnper(1))=0;elseif(A(1,nnper(1))==0)&(rand>fitness)A(1,nnper(1))=1;Enda=A; end在我的遺傳算法里面選擇操作是欠妥的。
?
?
三、結果分析
?
四、評價與分析:
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的fitype拟合多参数函数和遗传算法拟合多参数函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言实现测量数据处理,求出实际值的范围
- 下一篇: C语言实现割线法求零点以及详解割线法