⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 坐标轮换法.c

📁 优化设计C语言程序 进退法找区间、坐标轮换发、黄金分割法、区间消去法等
💻 C
字号:

 //本实验求函数 f(x)=(x-3)2 的搜索区间[a,b]。并用黄金分割法或插值法求最优解
#include <math.h>
#include <stdio.h>
/*  函数 f(x)=(x-3)2 	*/
double f(double x) 
{  return (x-3)*(x-3);
}
/* 求搜索区间[a,b]的函数, x0---初始点; h0---初始步长 */
void find_ab(double x0,double h0,double *a,double *b)
{
/* 参照流程图自己写出外推法(进退法)程序的内容 */

}

/*
  黄金分割法
  a,b---搜索区间[a,b]; e---精度
  x,y---最优解X*,F*
*/
void search_gold(double a,double b,double e,
			  double *x,double *y)
{
	double x1,x2,y1,y2;
	x1=a+0.382*(b-a); y1=f(x1);
	x2=a+0.618*(b-a); y2=f(x2);
	do {
	  if (y1<y2) {
		 b=x2; x2=x1; y2=y1;
		 x1=a+0.382*(b-a); y1=f(x1);
	  } else {
		 a=x1; x1=x2; y1=y2;
		 x2=a+0.618*(b-a); y2=f(x2);
	  }
	} while (b-a>e);
	*x=0.5*(a+b); *y=f(*x);
}
/* 本实验用鲍威尔方法求函数 f(x)=4(x1-5)2+(x2-6)2 的最优解*/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXN 10
double xkk[MAXN],xk[MAXN],sk[MAXN];
int N;

double F(double *x) 
{
 return 4*pow(x[0]-5,2)+pow(x[1]-6,2);
}

double f(double x)
{   int i; 
	for (i=0; i<N; i++)
	{ xkk[i]=xk[i]+x*sk[i];
	}
	return f(xkk);
}
/*
	无约束坐标轮换法
	x0--初始点
	e1--一维搜索精度
	e2--求解精度
*/
double nc_trans(double *x0,double e1,double e2)
{
	int i,j,k=1;
	double a,b,ax,ay,d;
	for (;;) {
	  for (j=0; j<N; j++) xk[j]=x0[j];
	  for (i=0; i<N; i++) 
	  {
		 for (j=0; j<N; j++) if (j==i) sk[j]=1; 
         else sk[j]=0;
		 find_ab(0,1,&a,&b);
		 search_gold(a,b,e2,&ax,&ay);
		 for (j=0; j<N; j++) xk[j]=xkk[j];
	  }
	  d=0;
	  for (j=0; j<N; j++) 
      d+=(x0[j]-xkk[j])*(x0[j]-xkk[j]);
	  d=sqrt(d);
	  printf("k=%d;",k);
	  for (j=0; j<N; j++)
      printf(",x[%d]=%lf;",j+1,xkk[j]);
	  printf("d=%lf\n",d);
	  if (d<=e1) break;
	  for (j=0; j<N; j++) x0[j]=xkk[j];
	  k++;
	}
	for (j=0; j<N; j++) x0[j]=xkk[j];
	return F(xkk);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -