matlab.docx
- 文档编号:30550102
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:52
- 大小:85.27KB
matlab.docx
《matlab.docx》由会员分享,可在线阅读,更多相关《matlab.docx(52页珍藏版)》请在冰豆网上搜索。
matlab
1.求反求参数(无约束非线性优化方法)的matlab实现
求反求参数(无约束非线性优化方法)的matlab实现
参数k,d。
初始值代入差分得到计算值T算,(由程序),
给出实测值T测,目标函数各点计算值与实测值的差最小。
?
因参数和目标函数间通过一系列数值计算,不知有下面的方法能否得到k,d
想用Nelder-Mead法(单纯形法)优化:
%Nelder-Mead法解最优化问题
%-函数f(x1,x2,...,xn)是一个有N个实数变量的函数,而且给定N+1个初始点
%Vk=(vk,1,...,vk,N),k=0,1,...,N
function[v0,y0,dv,dy]=nelder(F,V,min1,max1,epsilon,show)
%Input-Fistheobjectfunctioninputasstring'F'
% -Visa3*nmatrixcontaioningstaringsimplex
% -min1&max1areminimunandmaximunnumber
% ofiterations
% -epsilonisthetolerance
% -show==1displaysiterations(pandQ)
%output-v0isthevertexfortheminimun
% -y0isthefunctionvalueF(v0)
% -dVisthesizeofthefinalsimplex
% -dyistheerrorboundfortheminimum
% -p isamatrixcontainingthevertexiterations
% -Q isanarraycontainingtheiterationsforF(p)
ifnargin==5,
show=0;
end
[mmn]=size(V);
%Orderthevertices
forj=1:
n+1
z=V(j,1:
n);
Y(j)=feval(F,z);
end
[mmlo]=min(Y);
[mmhi]=max(Y);
li=hi;
ho=lo;
forj=1:
n+1
if(j~=lo&j~=hi&Y(j)<=Y(li))
li=j;
end
if(j~=hi&j~=lo&Y(j)>Y(li))
ho=j;
end
end
cnt=0;
%Startofnelder-Meadalgorithm
While(Y(hi)>Y(lo)+epsilon&cnt s=zeros(1,1: n); forj=1: n+1 s=s+V(j,1: n); end M=(s-V(hi,1: n))/n; R=2*M-V(hi,1: n); yR=feval(F,R); if(yR if(Y(li) V(hi,1: n)=R; Y(hi)=yR; else E=2*R-M; yE=feval(F,E); if(yE V(hi,1: n)=E; Y(hi)=yE; else V(hi,1: n)=E; Y(hi)=yR; end end else if(yR V(hi,1: n)=R; Y(hi)=yR; end c=(V(hi,1: n)+M)/2; yc=feval(F,c); c2(M+R)/2; yc2=feval(F,c2); if(yc2 c=c2; yc=yc2; end if(yc V(hi,1: n)=c; Y(hi)=yc; else forj=1: n+1 if(j~=lo) V(j,1: n)=(V(j,1: n)+V(lo,1: n))/2; z=V(j,1: n); Y(j)=feval(F,z); end end end end [mmlo]=min(Y); [mmhi]=max(Y); li=hi; ho=lo; forj=1;n+1 if(j~=lo&j~=hi&Y(j)<=Y(li)) li=j; end if(j~=hi&j~=lo&Y(j)>Y(ho)) ho=j; end end cnt=cnt+1; p(cnt,: )=V(lo,: ); Q(cnt)=Y(lo); end %EndofNelder-Meadalgorithm %Determinesizeofsimplex snorm=0; forj=1: n+1 s=norm(V(j)-V(lo)); if(s>=snorm) snorm=s; end end Q=Q'; V0=V(lo,1: n); y0=Y(lo); dV=snorm; dy=abs(Y(hi)-Y(lo)); if(show==1) disp(p); disp(Q); end 2.无约束非线性优化算法-Powell法优化子程序 2007-4-239: 09: 00 Powell算法是一种方向集方法,假设计算得问题是m因数,它取m个m维的共轭向量,并沿每一向量的方向进行最优值搜索,那么任何一个m元函数都可用一维搜索方法求其最优值。 它专门针对当目标函数特别复杂,因而没有办法掌握目标函数特性的一类优化问题。 在实际工程与科学计算中十分有用。 本程序包含5个C文件: mpowell.c,powell.c,funct.c,jtf.c,hjfgf.c CODE: #include"powell.c" main() {doublep[]={1,2}; doubleff,x[2]; ff=powell(p,0.3,0.001,0.0001,2,x); printf("x[0]=%f,x[1]=%f,ff=%f\n",x[0],x[1],ff); getch(); }powell.c代码如下: CODE: #include"hjfgf.c" doubleoneoptim(doublex0[],doubles[],doubleh0,doubleepsg,intn,doublex[]) {double*a,*b,ff; a=(double*)malloc(n*sizeof(double)); b=(double*)malloc(n*sizeof(double)); jtf(x0,h0,s,n,a,b); ff=gold(a,b,epsg,n,x); free(a); free(b); return(ff); } doublepowell(doublep[],doubleh0,doubleeps,doubleepsg,intn,doublex[]) {inti,j,m; double*xx[4],*ss,*s; doublef,f0,f1,f2,f3,fx,dlt,df,sdx,q,d; ss=(double*)malloc(n*(n+1)*sizeof(double)); s=(double*)malloc(n*sizeof(double)); for(i=0;i {for(j=0;j<=n;j++) *(ss+i*(n+1)+j)=0; *(ss+i*(n+1)+i)=1; } for(i=0;i<4;i++) xx[i]=(double*)malloc(n*sizeof(double)); for(i=0;i *(xx[0]+i)=p[i]; for(;;) {for(i=0;i {*(xx[1]+i)=*(xx[0]+i); x[i]=*(xx[1]+i); } f0=f1=objf(x); dlt=-1; for(j=0;j {for(i=0;i {*(xx[0]+i)=x[i]; *(s+i)=*(ss+i*(n+1)+j); } f=oneoptim(xx[0],s,h0,epsg,n,x); df=f0-f; if(df>dlt) {dlt=df; m=j; } } sdx=0; for(i=0;i sdx=sdx+fabs(x[i]-(*(xx[1]+i))); if(sdx {free(ss); free(s); for(i=0;i<4;i++) free(xx[i]); return(f); } for(i=0;i *(xx[2]+i)=x[i]; f2=f; for(i=0;i {*(xx[3]+i)=2*(*(xx[2]+i)-(*(xx[1]+i))); x[i]=*(xx[3]+i); } fx=objf(x); f3=fx; q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt); d=0.5*dlt*(f1-f3)*(f1-f3); if((f3 {if(f2<=f3) for(i=0;i *(xx[0]+i)=*(xx[2]+i); else for(i=0;i *(xx[0]+i)=*(xx[3]+i); } else {for(i=0;i {*(ss+(i+1)*(n+1))=x[i]-(*(xx[1]+i)); *(s+i)=*(ss+(i+1)*(n+1)); } f=oneoptim(xx[0],s,h0,epsg,n,x); for(i=0;i *(xx[0]+i)=x[i]; for(j=m+1;j<=n;j++) for(i=0;i *(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j); } } }funct.c代码如下: CODE: #include"stdio.h" #include"stdlib.h" #include"math.h" doubleobjf(doublex[]) {doubleff; ff=x[0]*x[0]+x[1]*x[1]-x[0]*x[1]-10*x[0]-4*x[1]+60; return(ff); }jtf.c代码如下: CODE: #include"funct.c" voidjtf(doublex0[],doubleh0,doubles[],intn,doublea[],doubleb[]) {inti; double*x[3],h,f1,f2,f3; for(i=0;i<3;i++) x[i]=(double*)malloc(n*sizeof(double)); h=h0; for(i=0;i *(x[0]+i)=x0[i]; f1=objf(x[0]); for(i=0;i *(x[1]+i)=*(x[0]+i)+h*s[i]; f2=objf(x[1]); if(f2>=f1) {h=-h0; for(i=0;i *(x[2]+i)=*(x[0]+i); f3=f1; for(i=0;i {*(x[0]+i)=*(x[1]+i); *(x[1]+i)=*(x[2]+i); } f1=f2; f2=f3; } for(;;) {h=2*h; for(i=0;i *(x[2]+i)=*(x[1]+i)+h*s[i]; f3=objf(x[2]); if(f2 else {for(i=0;i {*(x[0]+i)=*(x[1]+i); *(x[1]+i)=*(x[2]+i); } f1=f2; f2=f3; } } if(h<0) for(i=0;i {a[i]=*(x[2]+i); b[i]=*(x[0]+i); } else for(i=0;i {a[i]=*(x[0]+i); b[i]=*(x[2]+i); } for(i=0;i<3;i++) free(x[i]); }hjfgf.c代码如下: CODE: #include"jtf.c" doublegold(doublea[],doubleb[],doubleeps,intn,doublexx[]) {inti; doublef1,f2,*x[2],ff,q,w; for(i=0;i<2;i++) x[i]=(double*)malloc(n*sizeof(double)); for(i=0;i {*(x[0]+i)=a[i]+0.618*(b[i]-a[i]); *(x[1]+i)=a[i]+0.382*(b[i]-a[i]); } f1=objf(x[0]); f2=objf(x[1]); do {if(f1>f2) {for(i=0;i {b[i]=*(x[0]+i); *(x[0]+i)=*(x[1]+i); } f1=f2; for(i=0;i *(x[1]+i)=a[i]+0.382*(b[i]-a[i]); f2=objf(x[1]); } else {for(i=0;i {a[i]=*(x[1]+i); *(x[1]+i)=*(x[0]+i);} f2=f1; for(i=0;i *(x[0]+i)=a[i]+0.618*(b[i]-a[i]); f1=objf(x[0]); } q=0; for(i=0;i q=q+(b[i]-a[i])*(b[i]-a[i]); w=sqrt(q); }while(w>eps); for(i=0;i xx[i]=0.5*(a[i]+b[i]); ff=objf(xx); for(i=0;i<2;i++) free(x[i]); return(ff); 3.matlab广义最小二乘算法程序 下面这个程序是关于广义最小二乘算法的,希望大家共同讨论,多多提出改进意见。 %之前先运行input_output和LS程序% fid=fopen('input.txt','r+'); U=fscanf(fid,'%f',a); fclose(fid); fid1=fopen('output1.txt','r+'); Y=fscanf(fid1,'%f',a); fclose(fid1); fori=1: a; %计算系统模型的残差及参数% y1=Y(3: a); y2=Y(2: a); u1=U(2: a); H1=[y2;0]; H2=Y; H3=-1*[u1;0]; H4=-1*U; H=[H1H2H3H4]; e=[y1;0;0]+H*Q; e1=e(1: a-1); e2=e(1: a-2); E1=-1*[0;e1]; E2=-1*[0;0;e2]; E=[E1E2]; F=inv(E'*E)*E'*e; %使用估计参数对y、u进行滤波% Y1=Y(1: a-1); Y2=Y(1: a-2); Z1=[0;Y1]; Z2=[0;0;Y2]; Z=[Z1Z2]; Y=Y+Z*F; U1=U(1: a-1); U2=U(1: a-2); Z1=[0;U1]; Z2=[0;0;U2]; Z=[Z1Z2]; U=U+Z*F; Y3=Y(1: a-1); Y4=Y(1: a-2); U3=U(1: a-1); U4=U(1: a-2); %根据滤波后的输入输出数据再次进行最小二乘参数估计,求Q% D1=-1*[0;Y3]; D2=-1*[0;0;Y4]; D3=[0;U3]; D4=[0;0;U4]; D=[D1D2D3D4]; QQ=inv(D'*D)*D'*Y; q=norm(QQ-Q)/norm(Q); Q=QQ; ifq<10e-14 i q F Q break end end ppp='helpme' 4.matlab最小二乘法程序 呵呵,前几天在论坛上写了一个帖子给eight,感谢他一语惊醒梦中人,把我从一个提问者变成了动手者,而后又继续自己的编程之旅。 经过一个多星期的学习,我又有了一些体会。 现在,我的作业已经完成了大部分,回头再看当初贴在论坛上的程序觉得真丢人 ,居然写得那么“笨”,可惜帖子已经不能修改了,只能留在那里继续丢人了。 不过,那倒也记录了我成长的历程 其实最小二乘法也可以写得不像我原来的那么麻烦: fid=fopen('input.txt','r+'); U=fscanf(fid,'%f',a); fclose(fid); fid1=fopen('output1.txt','r+'); Y=fscanf(fid1,'%f',a); fclose(fid1); U1=U(1: a-1); U2=U(1: a-2); Y1=Y(1: a-1); Y2=Y(1: a-2); D1=-1*[0;Y1]; D2=-1*[0;0;Y2]; D3=[0;U1]; D4=[0;0;U2]; D=[D1D2D3D4]; Q=inv(D'*D)*D'*Y 下面是递推最小二乘的算法: m=input('m=') fid=fopen('input.txt','r+'); U=fscanf(fid,'%f',a); fclose(fid); fid1=fopen('output1.txt','r+'); Y=fscanf(fid1,'%f',a); fclose(fid1); U1=U(1: m-1); U2=U(1: m-2); Y1=Y(1: m-1); Y2=Y(1: m-2); Y3=Y(1: m); D1=-1*[0;Y1]; D2=-1*[0;0;Y2]; D3=[0;U1]; D4=[0;0;U2]; D=[D1D2D3D4]; Q=inv(D'*D)*D'*Y3; P=inv(D'*D); %以上程序是用最小二乘法计算的初值,取前m个数据% fori=m: a-1; x=[-1*Y(i);-1*Y(i-1);U(i);U(i-1)]; y=Y(i+1); p=1/(1+x'*P*x); Z=Q+P*x*p*(y-x'*Q); P=P-P*x*p*x'*P; q=norm(Z-Q)/norm(Q); Q=Z; ifq<10e-6; k=i-m q Q break end end ppp='helpme! ' 5.matlab一个遗传算法的程序 不知道为什么,明明设置了迭代次数为100,但图象却表明迭代了200次,下面是程序,帮忙看看 %标准遗传算法 %优化函数为f=x1+x2+x3+x4+x5+Y1+Y2+Y3+Y4+Y5+1000*(266-Y(10))^2,其中,90<=x<=143 %编码长度为10位,编码精度为0.0518 %种群规模设为20,遗传算子分别为比例选择,单点交叉和单点变异。 交叉概率0.7,变异概率0.1 %最大进化代数为100代,保优操作。 main.m initial; globalG; forG=1: 100 crossover; mutation; adapting; keepbest; selection; end result; %初始化函数,随机形成规模为40初始种群 initial.m pop(20,10)=0; best_individual(10)=0; %最优个体 adapt_ave(100)=0; %种群平均适应值 fori=1: 20 forj=1: 10 ifrand>0.5 pop(i,j)=1; else pop(i,j)=0; end end end %pop cleari; clea
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab