鲍威尔法C++源程序
优化设计鲍威尔法程序c语言
if(f1<=f2)
for(i=1;i<n;i++)
x0[i]=x1[i];
else
for(i=1;i<n;i++)
x0[i]=x2[i];
}
else
{
for(i=r;i<n;i++)
for(j=0;j<n;j++)
s[i][j]=s[i+1][j];
f1=f2;
for(i=0;i<n;i++)
x2[i]=x3[i];
f2=f3;
} /*搜索方向为正向*/
for(i=0;i<n;i++) /*计算第三试点*/
x3[i]=x2[i]+h*s[i];
f3=f(x3);
while(f3<f2) /*判断是否未完成搜索*/
{ /*未完成,继续搜索*/
h=2*h;
for(i=0;i<n;i++)
sum+=(b[i]-a[i])*(b[i]-a[i]);
}while(sqrt(sum)>flag*0.1);
for(i=0;i<n;i++)
x[i]=(float)0.5*(b[i]+a[i]);
}
/*鲍威尔法子程序*/
voiflag,float a[],float b[],float x[])
for(i=0;i<n;i++)
x1[i]=x2[i];
f1=f2;
for(i=0;i<n;i++)
鲍威尔法编程-powell法编程 c语言编程 c++6.0
for(i=0;i<N;i++)
{
printf("请输入初始点x[%d]=",i);
scanf("%f",&xo[i]);
}
printf("请输入迭代精度Ef,Ex=");
scanf("%f,%f",&c,&d);
printf("请输入步长T=");
scanf("%f",&t);
{
{
for(j=0;j<N;j++)
s[j]=ss[i][j];
}
fmin=ywyh(xooo,t,s,z);
for(j=0;j<N;j++)
x[j]=z[j];
fi[i]=fmin;
for(j=0;j<N;j++)
xooo[j]=x[j];
}
for(i=0;i<N;i++)
{
s[i]=x[i]-xoo[i];xe[i]=2*x[i]-xoo[i];
int i,j=0;
a=0;b=t;
f[0]=gs(x);
for(i=0;i<N;i++)
z[i]=x[i]+b*s[i];
f[1]=gs(z);
if(f[1]<f[0])
{
do
{t=2*t;b=b+t;f[0]=f[1];
for(i=0;i<N;i++)
z[i]=x[i]+b*s[i];
f[1]=gs(z);
机械优化设计鲍威尔法编程
机械优化设计鲍威尔法编程鲍威尔法(Powell's method)是一种常用于机械优化设计的迭代算法,它基于步长的方向进行,进而找到局部或全局最优解。
该算法主要用于解决无约束优化问题,即不涉及约束条件的优化设计。
下面将详细介绍鲍威尔法的编程实现。
鲍威尔法的基本思路是在迭代过程中通过多次步长方向,找到全局最优解。
具体步骤如下:1.初始化:设置初始点x0和迭代次数k=0。
2.计算方向:选择一个初始的方向d0和步长α,并将d0归一化为单位向量。
3. 求解新的迭代点:通过计算当前点xk加上步长α乘以方向dk,得到新的迭代点xk+14. 更新方向:计算新的方向dk+15. 判断是否达到终止条件:如果达到了终止条件,则输出当前点xk+1为最优解;否则,令k=k+1,返回第3步继续进行迭代。
下面给出一个使用Python编程实现鲍威尔法的示例代码:```pythonimport numpy as npdef powell_method(f, x0, alpha, eps, max_iter):#初始化x=x0d = np.eye(len(x0))k=0while k < max_iter:#计算方向和步长g=f(x)d_norm = np.linalg.norm(d, axis=0) d = d / d_normalpha = alpha / d_norm#求解新的迭代点x_new = x + alpha * d#更新方向g_new = f(x_new)delta = g_new - gd = np.roll(d, -1, axis=0)d[-1] = (x_new - x) / alpha#判断终止条件if np.linalg.norm(delta) < eps: return x_new#更新迭代点x = x_newk+=1return x#示例函数,目标是求解f(x)=(x[0]-1)^2+(x[1]-2)^2 def f(x):return (x[0] - 1) ** 2 + (x[1] - 2) ** 2#设置初始点、步长、终止条件和最大迭代次数x0 = np.array([0.0, 0.0])alpha = 0.1eps = 1e-6max_iter = 100#调用鲍威尔法进行优化设计x_opt = powell_method(f, x0, alpha, eps, max_iter) #输出最优解print("Optimal solution: ", x_opt)print("Optimal value: ", f(x_opt))```在上述代码中,目标函数f(x)为示例函数,可以根据具体的优化设计问题进行修改。
整数bresenham算法c语言
整数bresenham算法c语言整数Bresenham算法是一种用于绘制直线的算法,它可以在不使用浮点数的情况下,从一个点到另一个点绘制一条直线。
在C语言中,整数Bresenham算法可以通过以下代码实现:```c#include <stdio.h>#include <stdlib.h>void drawLine(int x1, int y1, int x2, int y2) {int dx = abs(x2 - x1);int dy = abs(y2 - y1);int sx = (x1 < x2) ? 1 : -1;int sy = (y1 < y2) ? 1 : -1;int err = dx - dy;while (x1 != x2 || y1 != y2) {printf('(%d, %d)', x1, y1);int e2 = err * 2;if (e2 > -dy) {err -= dy;x1 += sx;}if (e2 < dx) {err += dx;y1 += sy;}}printf('(%d, %d)', x2, y2);}int main() {drawLine(0, 0, 10, 5);return 0;}```在这个例子中,我们绘制了从点(0, 0)到点(10, 5)的直线。
首先,我们计算了x和y方向的步长(dx和dy)。
然后,我们确定了x 和y方向的符号(sx和sy),以便正确地移动到下一个点。
接下来,我们计算了误差(err),以便能够在需要时调整步长。
最后,我们通过循环移动到下一个点并在每个点上打印其坐标。
鲍威尔法C源程序
include <>include <>include <>include <>include <>include <>define n1 2define ttdefine ad//定义常量//tt 初始迭代步长//ad 收敛精度float ia;float fnyfloat x{float f;f=10powx0+x1-5,2+powx0-x1,2; //目标函数returnf;}float iteratefloat x,float a, float s{float x1;x1=float mallocn1 sizeoffloat;for int i=0;i<n1;i++x1i=xi+asi;returnx1;}float funcfloat x,float a,float s{float x1;x1=iteratex,a,s;float f=fnyx1;returnf;}void findingfloat a3,float f3,float xk,float s {float t=tt;float a1,f1;a0=0; f0=funcxk,a0,s;for int i=0;;i++{a1=a0+t; f1=funcxk,a1,s;if f1<f0break;if fabsf1-f0>=ad{t=-t;a0=a1; f0=f1;}else{if ia==1 return;t=t/2; ia=1;}}for i=0;;i++{a2=a1+t; f2=funcxk,a2,s;if f2>f1break;t=2t;a0=a1; f0=f1;a1=a2; f1=f2;}if a0>a2{a1=a0; f1=f0;a0=a2; f0=f2;a2=a1; f2=f1;}return;}//second insertfloat lagrangefloat xk,float ft,float s{float a3,f3;float b,c,d,aa;finding a,f,xk,s;for int i=0;;i++{if ia==1{aa=a1; ft=f1;break;}d=powa0,2-powa2,2a0-a1-powa0,2-powa1,2a0-a2;iffabsd==0break;c=f0-f2a0-a1-f0-f1a0-a2/d;iffabsc==0break;b=f0-f1-cpowa0,2-powa1,2/a0-a1;aa=-b/2c;ft=funcxk,aa,s;if fabsaa-a1<=ad{if ft>f1 aa=a1;break;}if aa>a1{if ft>f1{a2=aa; f2=ft;}else if ft<f1{a0=a1; a1=aa;f0=f1; f1=ft;}else if ft==f1{a2=aa; a0=a1;f2=ft; f0=f1;a1=a0+a2/2; f1=funcxk,a1,s;}}else{if ft>f1{a0=aa; f0=ft;}else if ft<f1{a2=a1; a1=aa;f2=f1; f1=ft;}else if ft==f1{a0=aa; a2=a1;f0=ft; f2=f1;a1=a0+a2/2; f1=funcxk,a1,s;}}}if ft>f1{aa=a1; ft=f1;}return aa;}float powellfloat xk{float hn1n1,sn1={0,0},ffn1+1={0,0,0};float f1,f3,aa;float dkn1,x0,xk1n1;int m=0,i,j;for i=0;i<n1;i++{forj=0;j<n1;j++{hij=0;if j==ihij=1;}}for int k=0;;k++{ff0=fnyxk;x0=xk;for i=0;i<n1;i++{for j=0;j<n1;j++sj=hij;float aa=lagrangexk,&ffi+1,s;xk=iteratexk,aa,s;}for i=0;i<n1;i++{float a,b;dki=xki-x0i;xk1i=2xki-x0i;}float max=fabsff1-ff0;for i=1;i<n1;i++if fabsffi+1-ffi>max{max=fabsffi+1-ffi;m=i;}f3=fnyxk1;if f3<ff0&&ff0+f3-2ff2powff0-ffn1-max,2<maxpowff0-f3,2 {aa=lagrangexk,&f1,dk;xk=iteratexk,aa,dk;for i=m;i<n1-1;i++for j=0;j<n1;j++hij=hi+1j;for j=0;j<n1;j++hn1-1j=dkj;}else{ifffn1>=f3 xk=xk1;}float xq=0;for i=0;i<n1;i++xq+=powxki-x0i,2;if xq<=adbreak;}returnxk;}void main{float xkn1={0,0};//取初始点float xx;xx=float mallocn1 sizeoffloat;xx=powellxk;float ff=fnyxx;cout<<"优化的结果为:"<<endl;printf"\n\nThe Optimal Design Result Is:\n";for int i=0;i<n1;i++printf"\n\t x%d =%f",i+1,xxi;printf"\n\t f=%f",ff;getch;}。
机械优化设计程序
机械优化设计程序(2009-04-24 19:30:52)转载标签:机械优化设计程序powell外点惩罚函数法c杂谈今天终于交了机械优化设计作业,程序贴出来,那位要用就拿去吧,资源共享了,O(∩_∩)O下面是利用外点惩罚函数(Powell)法求解三维目标函数最优解与最优值的程序,用C++编写。
#include<iostream.h>#include<math.h>double lamta[10]={0, 1.0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1};//鲍威尔方法初始化方向,线性无关double lamta1[3]={0, 0 , 0};//暂存新的搜索方向double x1[4]={0, 0 ,0, 0 };//x1到x3用于存储各共轭方向的点double x2[4]={0, 0 ,0, 0 };double x3[4]={0, 0 ,0, 0 };double x4[4]={0, 0 ,0, 0 };//x4用于中间判断double x5[4]={0, 0 ,0, 0 };//x5用存放于更换方向后产生的新点int m=0;//标志double x_[4]={0, 0, 0, 0};//暂存鲍威尔最优解double x0[4]={0, 2, 2 , 2};//初值double c=10;//递减系数double e=0.00001;//精度控制double r0=1;//初始惩罚因子double r=1;//函数声明部分void Powell(double r); //鲍威尔方法函数double fxy(double x1,double x2,double x3,double r); //待求函数double ysearch(double x); //一维搜索的目标函数void search(double &a,double &b,double h); //区间搜索double yellowcut(double &a,double &b); //黄金分割void sort(double *p,int size);//选择法排序void main() //约束优化方法主函数入口{cout<<"请输入精度"<<endl;cin>>e;changyan:Powell(r);double cmpare[4];int flag1=0;for (int i=1;i<=3;i++){cmpare[i]=x_[i]-x0[i];if (fabs(cmpare[i])<e){flag1++;}}if (flag1==3){cout<<"最优解为:"<<"x1="<<x_[1]<<" "<<"x2="<<x_[2]<<" "<<"x3="<<x_[3]<<endl;cout<<"最小值为"<<fxy(x_[1],x_[2],x_[3],r)<<endl;}else{for (int j=1;j<=3;j++){x0[j]=x_[j];}r=c*r;goto changyan;}}//子函数定义部分double fxy(double x1,double x2,double x3,double r)//待求函数{double m,n,p;m=(-x1>0)?(-x1):0;n=(-x2>0)?(-x2):0;p=(-x3>0)?(-x3):0;return //惩罚函数1000-x1*x1-2*x2*x2-x3*x3-x1*x2-x1*x3+r*(m*m+n*n+p*p)+r*((x1*x1+x2*x2+x3*x3-25)*(x1*x1+x2*x2+x3 *x3-25)+(8*x1+14*x2+7*x3-56)*(8*x1+14*x2+7*x3-56));}void Powell(double r) //鲍威尔方法函数定义double det=0.0001; //迭代精度int k;my1: for (k=1;k<=3;k++){m=3*k-2;double a=0,b=0,xo=0;search(a,b,1); //完成区间搜索double temp;temp=yellowcut(a,b);//黄金分割法int n=3*k-2;for (int i=1;i<=3;i++){switch (k){case 1:x1[i]=x0[i]+temp*lamta[n++];break;case 2:x2[i]=x1[i]+temp*lamta[n++];break;case 3:x3[i]=x2[i]+temp*lamta[n++];break;default :break;}}}double cmp[4];int flag=0;for (int i=1;i<=3;i++){cmp[i]=x3[i]-x0[i];if (fabs(cmp[i])<det){flag++;}}if (flag==3) //找到最优解x_[1]=x3[1];x_[2]=x3[2];x_[3]=x3[3];}else{double fy[4];fy[0]=fxy(x0[1],x0[2],x0[3],r);fy[1]=fxy(x1[1],x1[2],x1[3],r);fy[2]=fxy(x2[1],x2[2],x2[3],r);fy[3]=fxy(x3[1],x3[2],x3[3],r); double fyy[3]; for (int ii=0;ii<3;ii++){fyy[ii]=fy[ii]-fy[ii+1];}sort(fyy,3);for (ii=1;ii<=3;ii++){x4[ii]=2*x3[ii]-x0[ii];}double f0,f3,f4;f0=fy[0];f3=fy[3];f4=fxy(x4[1],x4[2],x4[3],r);if ((f0+f4-2*f3)/2>=fyy[2]){if (f3<f4){for (int t=1;t<=3;t++){x0[t]=x3[t];}}elsefor (int t=1;t<=3;t++){x0[t]=x4[t];}}goto my1;}else{for (int t=0;t<3;t++){lamta1[t]=x3[t+1]-x0[t+1];}m=0; //switch 标志!double aa=0,bb=0;search(aa,bb,1);double temp1;temp1=yellowcut(aa,bb);for (int i=1;i<=3;i++){x5[i]=x3[i]+temp1*lamta1[i-1];}for (i=1;i<=3;i++){x0[i]=x5[i];}for (i=1;i<=6;i++){lamta[i]=lamta[i+3];}for (i=1;i<=3;i++){lamta[6+i]=lamta1[i-1];}goto my1;}}}double ysearch(double x) //一维搜索的目标函数{switch (m){case 1: return fxy(x0[1]+x*lamta[m],x0[2]+x*lamta[m+1],x0[3]+x*lamta[m+2],r);break;case 4: return fxy(x1[1]+x*lamta[m],x1[2]+x*lamta[m+1],x1[3]+x*lamta[m+2],r);break;case 7: return fxy(x2[1]+x*lamta[m],x2[2]+x*lamta[m+1],x2[3]+x*lamta[m+2],r);break;case 0: return fxy(x3[1]+x*lamta1[0],x3[2]+x*lamta1[1],x3[3]+x*lamta1[2],r);break;//更改方向后的一维搜索default:return 0; break;}}void search(double &a,double &b,double h) //区间搜索{double a1,a2,a3,y1,y2,y3;h=1;a1=a,y1=ysearch(a1);a2=a+h,y2=ysearch(a2);if(y2>=y1){h=-h,a3=a1,y3=y1;a1=a2,y1=y2,a2=a3,y2=y3;}a3=a2+h,y3=ysearch(a3);while(y3<=y2){h=2*h;a1=a2,y1=y2,a2=a3,y2=y3;a3=a2+h,y3=ysearch(a3);}if(h<0)a=a3,b=a1;else a=a1,b=a3;}double yellowcut(double &a,double &b){double e; //黄金分割法求解e=0.001;double c,fc;c=a+0.382*(b-a);fc=ysearch(c);double d,fd;double xo;d=a+0.618*(b-a);fd=ysearch(d);label2: if (fc<=fd){b=d;d=c;fd=fc;c=a+0.382*(b-a);fc=ysearch(c);}else{a=c;c=d;fc=fd;d=a+0.618*(b-a);fd=ysearch(d);}if ((b-a)<=e){xo=(a+b)/2;}elsegoto label2;return xo;}void sort(double *p,int size){//选择法排序int i,j;double k;for(i=0;i<size-1;i++)for(j=i+1;j<size;j++)if(*(p+i)>*(p+j)){k=*(p+i);*(p+i)=*(p+j);*(p+j)=k;} }。
研究生优化理论各种算法、代码及运行结果
机械优化设计目录:1.1 进退法............................................................................................... - 3 -1.1.1进退法的原理和流程图.................................................................. - 3 -1.1.2进退法程序代码............................................................................. - 4 -1.1.3程序的调试及运行结果.................................................................. - 5 - 1.2 黄金分割............................................................................................. - 6 -1.2.1黄金分割法的原理和流程图........................................................... - 6 -1.2.2黄金分割法的程序代码.................................................................. - 6 -1.2.3程序的调试及运行结果.................................................................. - 8 - 1.3 二次插值 ........................................................................................... - 9 -1.3.1 二次插值确定搜索区间的原理和流程图........................................ - 9 -1.3.2二次插值的程序代码 ................................................................... - 10 -1.3.3程序的调试及运行结果................................................................ - 12 - 1.4 牛顿型法........................................................................................... - 13 -1.4.1牛顿型法的求极值的原理及其流程图 .......................................... - 13 -1.4.3程序的调试及运行结果................................................................ - 17 - 1.5 鲍威尔法 ......................................................................................... - 18 -1.5.1鲍威尔法的流程图....................................................................... - 18 -1.5.2鲍威尔法的程序代码 ................................................................... - 19 -1.5.3程序的调试及运行结果................................................................ - 22 - 1.6 复合型法........................................................................................... - 23 -1.6.1复合型法的求极值的原理及其流程图 .......................................... - 23 -1.6.2复合型法的程序代码 ................................................................... - 24 -1.6.3程序的调试及运行结果................................................................ - 30 - 1.7 内点惩罚函数法 ................................................................................ - 30 -1.7.1内点惩罚函数法的求极值的原理及其流程图................................ - 30 -1.7.2内点惩罚函数法的程序代码......................................................... - 31 -1.7.3程序的调试及运行结果................................................................ - 34 -2.1 圆柱齿轮减速器的优化计算 .............................................................. - 34 -2.1.1圆柱齿轮减速器优化问题的背景.................................................. - 34 -2.1.2圆柱齿轮减速器的优化设计......................................................... - 35 -2.1.2.1目标函数的确定 .................................................................. - 35 -2.1.2.2约束条件的确定 .................................................................. - 37 -2.1.4程序的调试及运行结果................................................................ - 42 -3.1体会及建议.......................................................................................... - 43 -附录........................................................................................................... - 44 -(1)fmincon函数 ......................................................................................... - 44 -1.1 进退法1.1.1进退法的原理和流程图进退法是用来确定搜索区间(包含极小值点的区间)的算法,其理论依据是:()f x 为单谷函数(只有一个极值点),且[,]a b 为其极小值点的一个搜索区间,对12,[,]x x a b ,于任意如果图1-1进退法程序框图()()12f x f x <,则2[,]a x 为极小值的搜索区间,如果()()12f x f x >,则1[,]x b 为极小值的搜索区间。
优化设计-鲍威尔法程序(c语言)
#include <stdio.h〉#include <math.h〉#define m 10 /*数组长度m >= 维数n */float f(float x[]);void mjtf(int n,float x0[],float h,float s[],float a[],float b[]);void mhjfgf(int n,float a[],float b[],float flag,float x[]);void mbwef(int n,float x0[],float h,float flag,float a[],float b[],float x[]);float f(float x[]){float result;result=60-10*x[0]—4*x[1]+x[0]*x[0]+x[1]*x[1]—x[0]*x[1]; return result;}/*多维进退法子程序*/void mjtf(int n,float x0[],float h,float s[],float a[],float b[]){int i;float x1[m],x2[m],x3[m],f1,f2,f3;for(i=0;i<n;i++) /*计算初始两试点*/{x1[i]=x0[i];x2[i]=x0[i]+h*s[i];}f1=f(x1);f2=f(x2);if(f2>=f1) /*判断搜索方向*/{ /*搜索方向为反向,转身*/h=(—1)*h;for(i=0;i〈n;i++)x3[i]=x1[i];f3=f1;for(i=0;i<n;i++)x1[i]=x2[i];f1=f2;for(i=0;i〈n;i++)x2[i]=x3[i];f2=f3;}/*搜索方向为正向*/for(i=0;i〈n;i++) /*计算第三试点*/x3[i]=x2[i]+h*s[i];f3=f(x3);while(f3〈f2) /*判断是否未完成搜索*/ { /*未完成,继续搜索*/h=2*h;for(i=0;i<n;i++)x1[i]=x2[i];f1=f2;for(i=0;i<n;i++)x2[i]=x3[i];f2=f3;for(i=0;i〈n;i++)x3[i]=x2[i]+h*s[i];f3=f(x3);}/*已完成*/for(i=0;i<n;i++) /*输出初始搜索区间*/{if(x1[i]<x3[i]){a[i]=x1[i];b[i]=x3[i];}else{a[i]=x3[i];b[i]=x1[i];}}}/*多维黄金分割法子程序*/void mhjfgf(int n,float a[],float b[],float flag,float x[]) {int i;float x1[m],x2[m],f1,f2,sum;for(i=0;i<n;i++) /*计算初始两试点*/x1[i]=b[i]-(float)0。
C语言经典源程序100例
C语言经典源程序100例1. Hello, World!这是C语言中最基本的程序,用于显示"Hello, World!"。
```c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}```2. 计算两数之和这个程序用于计算两个整数的和,并将结果输出。
```c#include <stdio.h>int main() {int num1, num2, sum;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);sum = num1 + num2;printf("两数之和为:%d\n", sum);return 0;}```3. 判断奇偶数这个程序用于判断一个整数是奇数还是偶数。
```c#include <stdio.h>int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (num % 2 == 0) {printf("该数是偶数。
\n");} else {printf("该数是奇数。
\n");}}```4. 求输入数字的平均值这个程序用于求输入数字的平均值。
```c#include <stdio.h>int main() {int count, i;double num, sum = 0.0, average;printf("请输入数字的个数:");scanf("%d", &count);printf("请输入这 %d 个数字:\n", count); for (i = 0; i < count; i++) {scanf("%lf", &num);sum += num;}average = sum / count;printf("平均值为:%lf\n", average);}```5. 判断闰年这个程序用于判断一个年份是否为闰年。
机械优化设计鲍威尔法编程
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
UpdateData(true);
int i,n;
double h1,h2,h3,m,flag,X00[2][1],d01[2][1],d02[2][1],d03[2][1]; //确定键的执行程序
double X01[2][1],X02[2][1],X03[2][1];
double F0,F1,F2,F3,e1,e2,em;
// the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMyDlg::OnOK()
{
// TODO: Add extra validation here
//CDialog::OnOK();
F1=(X01[0][0]*X01[0][0]+2*X01[1][0]*X01[1][0]-4*X01[0][0]-2*X01[0][0]*X01[1][0]),f1=F1; //确定F的函数值
h2=(4*d02[0][0]+2*d02[0][0]*X01[1][0]+2*d02[1][0]*X01[0][0])/(2*d02[0][0]*d02[0][0]+ //确定搜索步长
鲍威尔法VB程序设计
鲍威尔法实验报告姓名:刘阳阳学号:1201013009鲍威尔法程序设计1 方法(算法)介绍1.1 方法原理简介鲍威尔法——多维无约束优化算法是在无约束优化算法之一,首先选取一组共轭方向,从某个初始点出发,求目标函数在这些方向上的极小值点,然后以该点为新的出发点,重复这一过程直到获得满意解,其优点是不必计算目标函数的梯度就可以在有限步内找到极值点。
鲍威尔法是以共轭方向为基础的收敛较快的直接法之一,是一种十分有效的算法。
在无约束方法中许多算法都是以共轭方向作为搜索方向,它们具有许多特点。
根据构造共轭方向的原理不同,可以形成不同的共轭方向法。
基本算法1)任选一初始点x0,再选两个线性无关的向量,如坐标轴单位向量e1=[1,0]T 和e2=[0,1]T作为初始搜索方向。
2)从x0出发,顺次沿e1,e2作一维搜索,得x10,x20点,两点连线得一新方向d1=x20-x0。
用d1代替e1形成两个线性无关向量d1 ,e2 ,作为下一轮迭代的搜索方向。
再x20 出发,沿d1 作一维搜索得点x01,作为下一轮迭代的初始点。
3)从x1 出发,顺次沿,e2。
d1 作一维搜索,得到点x11,x21,两点连线得一新方向:d2=x21-x11。
4)沿d2d2作一维搜索得点.x2 ,即是二维问题的极小点x*把二维情况的基本算法扩展到n维,则鲍威尔基本算法的要点是:在每一轮迭代中总有一个始点(第一轮的始点是任选的初始点)和n个线性独立的搜索方向。
从始点出发顺次沿n个方向作一维搜索得一终点,由始点和终点决定了一个新的搜索方向。
用这个方向替换原来n个方向中的一个,于是形成新的搜索方向组。
替换的原则是去掉原方向组的第一个方向而将新方向排在原方向的最后。
此外规定,从这一轮的搜索终点出发沿新的搜索方向作一维搜索而得到的极小点,作为下一轮迭代的始点。
这样就形成算法的循环。
1.2 程序设计框图1.3程序说明本程序使用VB程序语言设计,在该程序中插入command模块picture模块利用矩阵函数语句迭代计算出鲍威尔最小值并将之在picture模块中显示出2 例题计算2.1 例题:用鲍威尔法求f(x1,x2)=10*(x1+x2-5)^2+(x1-x2)^22.2 计算结果与分析VB程序计算结果如图:经演算迭代后得到结果为:X0^2= 2.49952.5091 F0=f0(x0^2)=0.0008可见已足够接近极值点x*=(2.5,2.5)T 及极小值f(x*)=02.3 结论经验算鲍威尔法VB程序计算结果正确且为最优解。
C语言程序设计100例之(46):巧妙称重
C语⾔程序设计100例之(46):巧妙称重例46 巧妙称重题⽬描述有N个篮⼦,编号1~N,篮⼦中有很多⾦币,每个重w。
但是有⼀个编号的篮⼦中,每个⾦币重d。
现从第⼀个篮⼦中拿1个⾦币,第⼆个篮⼦中拿2个,…,第N-1中拿N-1个,第N中不拿,给出这些⾦币的总重量wei,问:是第⼏个篮⼦中的⾦币重量较轻?输⼊格式输⼊⽂件将由⼀⾏或多⾏组成;每⾏包含四个正整数,由⼀个空格分隔。
前三个整数分别是数字N、w和d,如上所述。
第四个整数是所选硬币称重的结果。
N⾄少为2,但不超过8000。
w的值最多为30。
d的值将⼩于w。
输出格式对于每组测试数据输出⼀⾏,由⼀个正整数组成:装有⽐其他篮⼦中⾦币轻的⾦币的篮⼦编号。
输⼊样例10 25 8 110910 25 8 10458000 30 12 959879400输出样例21050(1)编程思路。
这是⼀道数学题分析题。
若设1~N-1这N-1个篮⼦中放的⾦币均为重量为w的⾦币,则应有的总重量为:w*(1+n-1)*(n-1)/2(简单的等差数列求和),所求的和减去实际称出的重量wei,得到⾦币重量的差值sum = ((n-1)*(n-1+1)/2)*w-wei。
若sum为0,则装有重量为d的篮⼦编号必为N;若sum不为0,除以d,得到较轻⾦币的个数,即为所求编号。
(2)源程序。
#include <stdio.h>int main(){int n,w,d,p;while (scanf("%d%d%d%d",&n,&w,&d,&p)!=EOF){int sum = ((n-1)*(n-1+1)/2)*w-p;if(sum==0)printf("%d\n",n);elseprintf("%d\n",sum/d);}return 0;}习题4646-1 ⿁⾕⼦的钱袋题⽬描述⿁⾕⼦⾮常聪明,正因为这样,他⾮常繁忙,经常有各诸侯车的特派员前来向他咨询时政。
鲍威尔法编程-powell法编程c语言编程c++6.0.doc
数字信号处理实验讲义前言 (2)实验一MA TLAB简介 (3)实验二用FFT实现信号的谱分析 (5)实验三IIR数字巴特沃思滤波器的设计 (8)实验四FIR数字滤波器的设计 (9)前言信号处理与计算机的应用紧密结合。
目前广泛应用的MA TLAB工具软件包,以其强大的分析、开发及扩展功能为信号处理提供了强有力的支持。
在数字信号处理实验中,我们主要应用MA TLAB的信号处理工具箱及其灵活、便捷的编程工具,通过上机实验,帮助学生学习、掌握和应用MA TLAB软件对信号处理所学的内容加以分析、计算,加深对信号处理基本算法的理解。
实验一 MATLAB 简介实验目的1.熟悉MA TLAB 软件的使用方法; 2.MA TLAB 的绘图功能;3.用MA TLAB 语句实现信号的描述及变换。
实验原理1.在MA TLAB 下编辑和运行程序在MA TLAB 中,对于简单问题可以在命令窗(command windows )直接输入命令,得到结果;对于比较复杂的问题则可以将多个命令放在一个脚本文件中,这个脚本文件是以m 为扩展名的,所以称之为M 文件。
用M 文件进行程序的编辑和运行步骤如下:(1)打开MA TLAB ,进入其基本界面;(2)在菜单栏的File 项中选择新建一个M 文件;(3)在M 文件编辑窗口编写程序;(4)完成之后,可以在编辑窗口利用Debug 工具调试运行程序,在命令窗口查看输出结果;也可以将此文件保存在某个目录中,在MA TLAB 的基本窗口中的File 项中选择Run The Script ,然后选择你所要运行的脚本文件及其路径,即可得出结果;也可以将此文件保存在当前目录中,在MA TLAB 命令窗口,“>>”提示符后直接输入文件名。
2.MA TLAB 的绘图功能plot(x,y) 基本绘图函数,绘制 x 和y 之间的坐标图。
figure(n ) 开设一个图形窗口nsubplot(m,n,N) 分割图形窗口的MA TLAB 函数,用于在一个窗口中显示多个图形,将图形窗口分为m 行n 列,在第N 个窗口内绘制图形。
10种简单的数字滤波算法(C语言源程序)
10种简单的数字滤波算法(C语言源程序)1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制那种周期性的干扰平滑度差#define A 10char value;char filter(){char new_value;new_value = get_ad();if ( ( new_value - value > A ) || ( value - new_value > A )return value;return new_value;}2、中位值滤波法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜#define N 11char filter(){char value_buf[N];char count,i,j,temp;for ( count=0;count<N;count++){value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;i++){if ( value_buf[i]>value_buf[i+1] ){temp = value_buf[i];value_buf[i] = value_buf[i+1];value_buf[i+1] = temp;}}}return value_buf[(N-1)/2];}3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM#define N 12char filter(){int sum = 0;for ( count=0;count<N;count++){sum + = get_ad();delay();}return (char)(sum/N);}4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=412;温度,N=14B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统C、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费RAM#define N 12char value_buf[N];char i=0;char filter(){char count;int sum=0;value_buf[i++] = get_ad();if ( i == N ) i = 0;for ( count=0;count<N,count++)sum = value_buf[count];return (char)(sum/N);}5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值N值的选取:3~14B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM#define N 12char filter(){char count,i,j;char value_buf[N];int sum=0;for (count=0;count<N;count++) {value_buf[count] = get_ad(); delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;i++){if ( value_buf[i]>value_buf[i+1] ) {temp = value_buf[i];value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp;}}}for(count=1;count<N-1;count++) sum += value[count];return (char)(sum/(N-2));}6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:比较浪费RAM略参考子程序1、37、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)本次采样值+a上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号#define a 50char value;char filter(){char new_value;new_value = get_ad();return (100-a)value + a new_value;}8、加权递推平均滤波法A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。
(整理)潘隆武-B09310524-机制09-5-鲍威尔法
鲍威尔共轭方向法实验报告姓名: 潘隆武 学号:B09310534 班级:机制09-5(2+2)一、 实验目的1. 加深对鲍威尔法的基本理论和算法步骤的理解。
2. 培养独立编制、调试计算机程序的能力。
3. 掌握常用优化程序的使用方法。
4. 培养灵活运用优化设计方法解决工程实际问题的能力。
二、 实验要求1. 明确鲍威尔法基本原理及程序框图。
2. 编制鲍威尔法程序。
三.实验内容计算实例:用鲍威尔法求函数22121212(,)10(5)()f x x x x x x =+-+-的极小值步骤一:利用matlab 先画出函数12(,)f x x 的图线,并标出关键点,以备检验程序的运行结果是否正确,如图a 。
图a步骤二:通过编制鲍威尔法C语言程序求函数极小值①.鲍威尔法基本原理简述任选一初始点X0,再选两个线性无关的向量。
从X0出发,顺次沿e1、e2作一维搜索得0X、02X,两点连线得一新方向d1,用d1代替1e1形成两个线性无关向量e2、d1,作为下一轮搜索方向。
再从0X出发,2沿d1作一维搜索得点0X,作为下一轮迭代的初始点。
从X1出发,顺1次沿e2、d1作一维搜索,得到点1X、12X,两点的连线得一新方向d2。
11X、12X两点是从不同点X0、11X出发,分别沿d1方向进行一维搜索而0得到的极小点。
再从1X出发,沿d2作一维搜索得点X2,即是二维问2题的极小点X*。
②、程序的流程图③.编制鲍威尔法程序#include "stdio.h"#include "stdlib.h"#include "math.h"double objf(double x[]) /*目标函数子程序*/{double ff; /*定义目标函数*/ff=pow(10*(x[1]+x[0]-5),2)+pow((x[1]-x[0]),2);return(ff); /*返回目标函数的计算值*/}void jtf(double x0[],double h0,double s[],int n,double a[],double b[]) /*确定搜索区间的进退法(外推法)子程序*/{int i;double *x[3],h,f1,f2,f3;for(i=0;i<3;i++)x[i]=(double *)malloc(n*sizeof(double)); /*分配n个double型存储单元,并将首地址存储到指针变量x[i]中*/h=h0; /*把初始步长h0赋给h*/for(i=0;i<n;i++) /*将初始点赋给x[0]*/*(x[0]+i)=x0[i];f1=objf(x[0]); /*计算x[0]处的函数值*/for(i=0;i<n;i++) /*根据步长h正向搜索*/*(x[1]+i)=*(x[0]+i)+h*s[i];f2=objf(x[1]);if(f2>=f1) /*若f2>f1,则步长变号,反向搜索*/{ h=-h0;for(i=0;i<n;i++)*(x[2]+i)=*(x[0]+i);f3=f1;for(i=0;i<n;i++){*(x[0]+i)=*(x[1]+i);*(x[1]+i)=*(x[2]+i);}f1=f2;f2=f3;}for(;;) /*步长乘2继续向前搜索直到函数值再次上升为止*/{h=2*h;for(i=0;i<n;i++)*(x[2]+i)=*(x[1]+i)+h*s[i];f3=objf(x[2]);if(f2<f3) break;else{ for(i=0;i<n;i++){*(x[0]+i)=*(x[1]+i);*(x[1]+i)=*(x[2]+i);}f1=f2;f2=f3;}}if(h<0) /*搜索结束,根据h的正负把搜索得到的区间左、右端点分别赋给a、b*/for(i=0;i<n;i++){a[i]=*(x[2]+i);b[i]=*(x[0]+i);}elsefor(i=0;i<n;i++){a[i]=*(x[0]+i);b[i]=*(x[2]+i);}for(i=0;i<3;i++)free(x[i]); /*释放x[]存储单元的内存*/}double gold(double a[],double b[],double eps,int n,double xx[]) /*黄金分割法子程序*/{int i;double f1,f2,*x[2],ff,q,w;for(i=0;i<2;i++)x[i]=(double *)malloc(n*sizeof(double)); /*分配n个double型存储单元,并将首地址存储到指针变量x[i]中*/for(i=0;i<n;i++) /*计算初始两试点*/{*(x[0]+i)=a[i]+0.618*(b[i]-a[i]); /*计算右试点x[0]*/*(x[1]+i)=a[i]+0.382*(b[i]-a[i]); /*计算左试点x[1]*/}f1=objf(x[0]); /*计算初始右试点的函数值*/f2=objf(x[1]); /*计算初始左试点的函数值*/do{if(f1>f2) /*根据的f1、f2大小关系判断消去区间*/{for(i=0;i<n;i++) /*消去左区间*/{b[i]=*(x[0]+i);*(x[0]+i)=*(x[1]+i);}f1=f2;for(i=0;i<n;i++)*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);f2=objf(x[1]);}else /*消去右区间*/{ for(i=0;i<n;i++){a[i]=*(x[1]+i);*(x[1]+i)=*(x[0]+i);}f2=f1;for(i=0;i<n;i++)*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);f1=objf(x[0]);}q=0;for(i=0;i<n;i++)q=q+(b[i]-a[i])*(b[i]-a[i]);w=sqrt(q);}while(w>eps); /*如果误差不满足收敛精度eps,进行循环迭代,直到满足收敛精度eps为止*/for(i=0;i<n;i++)xx[i]=0.5*(a[i]+b[i]); /*输出极小点,即最小区间的中点作为极小值点的数值xx[i]*/ ff=objf(xx); /*计算极小值点的函数值*/for(i=0;i<2;i++)free(x[i]); /*释放x[i]所占的存储单元的空间*/return(ff); /*返回运行黄金分割法子程序的最终结果,即函数的极小值*/}double oneoptim(double x0[],double s[],double h0,double epsg,int n,double x[]) /*一维搜索子程序*/{double *a,*b,ff;a=(double *)malloc(n*sizeof(double)); /*分配n个double型存储单元,并将首地址存储到指针变量a中*/b=(double *)malloc(n*sizeof(double)); /*分配n个double型存储单元,并将首地址存储到指针变量b中*/jtf(x0,h0,s,n,a,b); /*调用进退法程序jtf( )确定搜索区间[a,b]*/ff=gold(a,b,epsg,n,x); /*调用黄金分割法程序gold( )确定每一个点的函数值*/free(a); /*释放a[i]所占的存储单元的空间*/free(b); /*释放b[i]所占的存储单元的空间*/return (ff); /*返回一维搜索子程序oneoptim()的最终结果,即函数的极小值*/}double powell(double p[],double h0,double eps,double epsg,int n,double x[]) /*鲍威尔法子程序Powell()*/{int i,j,m;double *xx[4],*ss,*s;double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;ss=(double *)malloc(n*(n+1)*sizeof(double)); /*分配n*(n+1)个的double型存储单元,并将首地址存储到指针变量ss中*/s=(double *)malloc(n*sizeof(double)); /*分配n个double型存储单元,并将首地址存储到指针变量s中*/for(i=0;i<n;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)); /*分配n个double型存储单元,并将首地址存储到指针变量xx[i]中*/for(i=0;i<n;i++)*(xx[0]+i)=p[i]; /*将给定的初始点赋给xx[0]*/for(;;){for(i=0;i<n;i++) /*将给定的初始点赋给x[]*/{*(xx[1]+i)=*(xx[0]+i);x[i]=*(xx[1]+i);}f0=f1=objf(x); /*计算在初始点函数值*/dlt=-1;for(j=0;j<n;j++){for(i=0;i<n;i++) /*依次按每个方向搜索*/{*(xx[0]+i)=x[i]; /*确定每次的搜索方向*/*(s+i)=*(ss+i*(n+1)+j);}f=oneoptim(xx[0],s,h0,epsg,n,x); /*调用一维搜索子程序oneoptim()并返回每次搜索后求得的极小值*/df=f0-f; /*计算函数下降值*/if(df>dlt) /*如果函数下降值大于-1则交换j与m*/{dlt=df; /*交换△m与m的值*/m=j;}}sdx=0;for(i=0;i<n;i++) /*计算误差*/sdx=sdx+fabs(x[i]-(*(xx[1]+i)));if(sdx<eps) /*如果满足精度要求*/{free(ss);free(s);for(i=0;i<4;i++)free(xx[i]);return(f);}for(i=0;i<n;i++)*(xx[2]+i)=x[i];f2=f; /*将终点的函数值赋给f2*/for(i=0;i<n;i++) /*计算映射点*/{*(xx[3]+i)=2*(*(xx[2]+i)-(*(xx[1]+i)));x[i]=*(xx[3]+i);}fx=objf(x); /*计算映射点的函数值*/f3=fx; /*将映射点的函数值赋给f3*/q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt);d=0.5*dlt*(f1-f3)*(f1-f3);if((f3<f1)||(q<d)) /*判断是否需要换方向*/ /*不需要换*/{if(f2<=f3) /*判断将终点还是将映射点赋给下一轮始点*/ for(i=0;i<n;i++) /*将终点赋给下一轮始点*/*(xx[0]+i)=*(xx[2]+i);else /*将映射点赋给下一轮始点*/for(i=0;i<n;i++)*(xx[0]+i)=*(xx[3]+i);}else /*去掉第r+1个方向,其它方向前移*/ {for(i=0;i<n;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<n;i++) /*将映射点赋给下一轮始点*/*(xx[0]+i)=x[i];for(j=m+1;j<=n;j++)for(i=0;i<n;i++)*(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j);}}}void main() /*主程序*/{double p[]={1,2}; /*设定使用鲍威尔法时的初始点为p(1,2)*/double ff,x[2];ff=powell(p,0.002,0.00000001,0.00000001,2,x);/*调用鲍威尔法子程序计算最终函数的极小值,并同时设定使用鲍威尔法时的初始点为p(1,2),外推法的初始步长h0为0.002,鲍威尔法的精度为0.00000001,黄金分割法的精度为0.00000001,目标函数的变量n 为2个,变量为x */printf("\n所求函数是:f(x)=10(x1+x2-5)^2+(x1-x2)^2");printf("\n使用鲍威尔法时的迭代初始点为:p(1,2)");printf("\n鲍威尔法的精度为:0.00000001");printf("\n外推法的初始步长:ho为0.002");printf("\n黄金分割法的精度为:0.00000001");printf("\n求得极值点坐标为:x[0]=%f,x[1]=%f;极小值是:f(%f,%f)=%f\n",x[0],x[1],x[0],x[1],ff); /*输出极值点和极小值*/}④.程序运行结果四、实验结果分析:从上面的程序运行结果和利用Matlab解出的结果相比较,利用鲍威尔法求函数的极小值时,在计算机运行性能满足条件的情况下,只要把外推法的初始步长h0、鲍威尔法的精度为e1、黄金分割法的精度为e2设置的足够小,那么计算结果的精确度可以达到很高的精度值。
优化设计 鲍威尔算法Microsoft Word 文档
第一个程序1:#include<stdio.h>#include<math.h>#define TOL 1.0e-3#define m 10#define RUN#define n 2float golden(float a[], float b[], float c[], float tol,floatxmin[]);voidmnbrak(float a[], float b[], float c[],float d[], float *fa, float *fb, float *fc);floatfunc(float x[]){float result;result=60-10*x[0]-4*x[1]+x[0]*x[0]+x[1]*x[1]-x[0]*x[1];//result=10*(float)pow((x[0]+x[1]-5),2)+(float)pow((x[0]-x[1]),2);return result;}float main(void){inti,k,j,v=0,dmax=0,flag=0;floate,l,a[m],a1[m],a2[m],a3[m],b[m],c[m],d[m],d1[m][m],fa,fb,fc,xmin[m],xmin2[m],gold,amin,ac=0, x[m];printf("鲍威尔求二维函数最小值:\n");#ifdef RUNprintf("输入初始点:");for(i=0;i<n;i++){printf("\na[%d]=",i);scanf("%f",&a[i]);}for(k=0;k<n;k++){printf("\n输入初始搜索方向%d:\n",i);for(j=0;j<n;j++){printf("\nd%d[%d]=",k,j);scanf("%f",&d1[k][j]);}}printf("输入搜索精度e:\n");scanf("%f",&e);#endif#ifndef RUNfor(i=0;i<n;i++)a[i] = 0;d1[0][0] =1;d1[0][1]=0;d1[1][0]=0;d1[1][1]=1;e=0.001;#endif//开始进行搜索//// printf("开始进行最小搜索\n");for(v=0;v<10000;v++)//一共最多进行10000次搜索{ //printf("已开始进行%d轮搜索\n",v+1);for(i=0;i<n;i++)a1[i]=a[i];//保存起始点a[]for(k=0;k<n;k++)//分别对所给方向进行搜索共n次{ //printf("已开始进行第%d个方向的搜索\n",k);for(j=0;j<n;j++){d[j]=d1[k][j];//printf("tiaoshi");a2[j]=a[j];}//printf("tiaoshi");//保存每次搜索的起点用于计算差值mnbrak(a,b,c,d,&fa,&fb,&fc);gold=golden(a,b,c,TOL,xmin);for(i=0;i<n;i++)//替换起点a[]准备下次搜索的起点a[i]=xmin[i];amin=gold-func(a2);//amin中间点的差值if(flag==0){ac=amin;flag=1;}if(ac<amin){ac=amin;//ac储存n个中最大差值dmax=k;//储存n次中差值最大的搜索方向。
鲍威尔法程序
鲍威尔法程序鲍威尔法程序:x0=[12;10];xk=x0;ie=10^(-4);ae=1;%初始化搜索方向d=zeros(2,2);d(:,1)=[1;0];d(:,2)=[0;1];Inc=zeros(2,1);k=1;MLN=100;%迭代求解while (ae>ie&&k<mln)< p=""> syms x1syms x2xktemp=xk;fun1=fun(x1,x2);fun1=inline(fun1);f0=feval(fun1,xk(1),xk(2));F0=f0;if k>0F0=eval(F0);end%沿d1方向进行一维搜索syms asyms x1;syms x2;xk1=xk+a*d(:,1);x1=xk1(1);x2=xk1(2);fun1=fun(x1,x2);fxa=diff(fun1,'a');a=solve(fxa);xk1=inline(xk1);xk1=feval(xk1,a);xk1(1)=eval(xk1(1));xk1(2)=eval(xk1(2));syms x1;syms x2;fun1=fun(x1,x2);fun1=inline(fun1);f1=feval(fun1,xk1(1),xk1(2)); f1=eval(f1);Inc(1)=f0-f1;%沿d2方向进行搜索syms a;syms x1;syms x2;xk2=xk1+a*d(:,2);x1=xk2(1);x2=xk2(2);fun1=fun(x1,x2);fxa=diff(fun1,'a');a=solve(fxa);xk2=inline(xk2);xk2=feval(xk2,a);xk2(1)=eval(xk2(1));xk2(2)=eval(xk2(2));syms x1;syms x2;fun1=fun(x1,x2);fun1=inline(fun1);f2=feval(fun1,xk2(1),xk2(2));f2=eval(f2);F2=f2;Inc(2)=f1-f2;[Incm,row]=max(Inc);x3=2*xk2-xk;%计算反射点syms x1;syms x2;fun1=fun(x1,x2);fun1=inline(fun1);f3=feval(fun1,x3(1),x3(2));f3=eval(f3);F3=f3;temp1=(F0-2*F2+F3)*(F0-F2-Incm)^2; temp2=0.5*Incm*(F0-F3)^2;%判断是否更换搜索方向if (F3<f0&&temp1<temp2)< p="">syms a;syms x1;syms x2;d(:,row)=xk2-xk;xk=xk2+a*d(:,row);x1=xk(1);x2=xk(2);fun1=fun(x1,x2);fxa=diff(fun1,'a');a=solve(fxa);xk=inline(xk);xk=feval(xk,a);%不更换搜索方向else if F2<f3< p="">xk=xk2;elsexk=x3;endendxkerror=eval(xk2-xktemp);ae=norm(xkerror);k=k+1;endx=eval(xk)function [f]=fun(x1,x2)f=60-10*x1-4*x2+x1^2+x2^2-x1*x2 </f3<></f0&&temp1<temp2)<></mln)<>。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
鲍威尔法C++源程序(总5页) -CAL-FENGHAI.-(YICAI)-Company One1
-CAL-本页仅作为文档封面,使用请直接删除
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#include <conio.h>
#define n1 2
#define tt 0.005
#define ad 0.0000001
//定义常量
//tt 初始迭代步长
//ad 收敛精度
float ia;
float fny(float *x)
{
float f;
f=10*pow((x[0]+x[1]-5),2)+pow((x[0]-x[1]),2); //目标函数return(f);
}
float *iterate(float *x,float a, float *s)
{
float *x1;
x1=(float *)malloc(n1 * sizeof(float));
for (int i=0;i<n1;i++)
x1[i]=x[i]+a*s[i];
return(x1);
}
float func(float *x,float a,float *s)
{
float *x1;
x1=iterate(x,a,s);
float f=fny(x1);
return(f);
}
void finding(float a[3],float f[3],float *xk,float *s)
{
float t=tt;
float a1,f1;
a[0]=0; f[0]=func(xk,a[0],s);
for (int i=0;;i++)
{
a[1]=a[0]+t; f[1]=func(xk,a[1],s);
if (f[1]<f[0])
break;
if (fabs(f[1]-f[0])>=ad)
{
t=-t;
a[0]=a[1]; f[0]=f[1];
}
else{
if (ia==1) return;
t=t/2; ia=1;
}
}
for (i=0;;i++)
{
a[2]=a[1]+t; f[2]=func(xk,a[2],s);
if (f[2]>f[1])
break;
t=2*t;
a[0]=a[1]; f[0]=f[1];
a[1]=a[2]; f[1]=f[2];
}
if (a[0]>a[2])
{
a1=a[0]; f1=f[0];
a[0]=a[2]; f[0]=f[2];
a[2]=a1; f[2]=f1;
}
return;
}
//second insert
float lagrange(float *xk,float *ft,float *s)
{
float a[3],f[3];
float b,c,d,aa;
finding (a,f,xk,s);
for (int i=0;;i++)
{
if (ia==1)
{
aa=a[1]; *ft=f[1];
break;
}
d=(pow(a[0],2)-pow(a[2],2))*(a[0]-a[1])-(pow(a[0],2)-pow(a[1],2))*(a[0]-a[2]);
if(fabs(d)==0)
break;
c=((f[0]-f[2])*(a[0]-a[1])-(f[0]-f[1])*(a[0]-a[2]))/d;
if(fabs(c)==0)
break;
b=((f[0]-f[1])-c*(pow(a[0],2)-pow(a[1],2)))/(a[0]-a[1]);
aa=-b/(2*c);
*ft=func(xk,aa,s);
if (fabs(aa-a[1])<=ad)
{
if (*ft>f[1]) aa=a[1];
break;
}
if (aa>a[1])
{
if (*ft>f[1])
{
a[2]=aa; f[2]=*ft;
}
else if (*ft<f[1])
{
a[0]=a[1]; a[1]=aa;
f[0]=f[1]; f[1]=*ft;
}
else if (*ft==f[1])
{
a[2]=aa; a[0]=a[1];
f[2]=*ft; f[0]=f[1];
a[1]=(a[0]+a[2])/2; f[1]=func(xk,a[1],s);
}
}
else
{
if (*ft>f[1])
{
a[0]=aa; f[0]=*ft;
}
else if (*ft<f[1])
{
a[2]=a[1]; a[1]=aa;
f[2]=f[1]; f[1]=*ft;
}
else if (*ft==f[1])
{
a[0]=aa; a[2]=a[1];
f[0]=*ft; f[2]=f[1];
a[1]=(a[0]+a[2])/2; f[1]=func(xk,a[1],s);
}
}
}
if (*ft>f[1])
{
aa=a[1]; *ft=f[1];
}
return (aa);
}
float *powell(float *xk)
{
float h[n1][n1],s[n1]={0,0},ff[n1+1]={0,0,0};
float f1,f3,aa;
float dk[n1],*x0,xk1[n1];
int m=0,i,j;
for (i=0;i<n1;i++)
{
for(j=0;j<n1;j++)
{
h[i][j]=0;
if (j==i)
h[i][j]=1;
}
}
for (int k=0;;k++)
{
ff[0]=fny(xk);
x0=xk;
for (i=0;i<n1;i++)
{
for (j=0;j<n1;j++)
s[j]=h[i][j];
float aa=lagrange(xk,&ff[i+1],s);
xk=iterate(xk,aa,s);
}
for (i=0;i<n1;i++)
{
float a,b;
dk[i]=xk[i]-x0[i];
xk1[i]=2*xk[i]-x0[i];
}
float max=fabs(ff[1]-ff[0]);
for (i=1;i<n1;i++)
if (fabs(ff[i+1]-ff[i])>max)
{
max=fabs(ff[i+1]-ff[i]);
m=i;
}
f3=fny(xk1);
if ((f3<ff[0])&&((ff[0]+f3-
2*ff[2])*pow((ff[0]-ff[n1]-max),2)<0.5*max*pow((ff[0]-f3),2)))
{
aa=lagrange(xk,&f1,dk);
xk=iterate(xk,aa,dk);
for (i=m;i<n1-1;i++)
for (j=0;j<n1;j++)
h[i][j]=h[i+1][j];
for (j=0;j<n1;j++)
h[n1-1][j]=dk[j];
}
else
{
if(ff[n1]>=f3) xk=xk1;
}
float xq=0;
for (i=0;i<n1;i++)
xq+=pow((xk[i]-x0[i]),2);
if (xq<=ad)
break;
}
return(xk);
}
void main()
{
float xk[n1]={0,0};//取初始点
float *xx;
xx=(float *)malloc(n1 *sizeof(float));
xx=powell(xk);
float ff=fny(xx);
cout<<"优化的结果为:"<<endl;
printf("\n\nThe Optimal Design Result Is:\n");
for (int i=0;i<n1;i++)
printf("\n\t x[%d] *=%f",i+1,xx[i]);
printf("\n\t f*=%f",ff);
getch();
}。