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

📄 kexingfangxiangfa.c

📁 线性约束条件的只需一次迭代的可行方向法。
💻 C
字号:
#include <stdio.h>
#include <math.h>
float min(),fx(),fx1(),fx2(),finda();
float p1,p2,x1,x2,f,fx11,fx12,a,minz;
float x[2][1];

void main()
{
 float x0[2][1]={{2},{1}},x1[2][1],x2[2][1];
 float b,xx,fz,f1,f2;
 x[0][0]=x0[0][0];
 x[1][0]=x0[1][0];
 if(x[0][0]+x[1][0]<=6)
 {fx1();
  fx2();
  finda();
  x1[0][0]=x0[0][0]+a*fx11;
  x1[1][0]=x0[1][0]+a*fx12;
  x[0][0]=x1[0][0];
  x[1][0]=x1[1][0];
  fx1();
  fx2();
  fx11=-fx11;
  fx12=-fx12;
  min();
  printf("%f,%f,%f,%f\n",a,p1,p2,minz);

	           b=-10;
	           xx=0.0001;
		   x[0][0]=x1[0][0]+ (b+xx)*p1;
		   x[1][0]=x1[1][0]+ (b+xx)*p2;
		   f2=fx();
		   x[0][0]=x1[0][0]+ b*p1;
		   x[1][0]=x1[1][0]+ b*p2;
		   f1=fx();
		   f=(f2-f1)/xx;
		  while(f<-0.01|f>0.01)
			   {
					 b=b+0.01;
					 x[0][0]=x1[0][0]+ b*p1;
					 x[1][0]=x1[1][0]+ b*p2;
					 f1=fx();
					 x[0][0]=x1[0][0]+ (b+xx)*p1;
					 x[1][0]=x1[1][0]+ (b+xx)*p2;
					 f2=fx();
					 f=(f2-f1)/xx;
				}
				x2[0][0]=x1[0][0]+ b*p1;
				x2[1][0]=x1[1][0]+ b*p2;
				x[0][0]=x2[0][0];
				x[1][0]=x2[1][0];
				fz=fx();
        printf("%f,%f,%f,%f\n",b,x2[0][0],x2[1][0],fz);
  }
 else
 printf("wrong\n");
}
float min()
{
 int i,j,a,b;
 float z,p3,p11,p33;
 minz=10;
 a=fx11,b=fx12;
 p1=-1;p3=0;
 for(i=0;i<200;i++)
  { for(i=0;i<200;i++)
	{ z=(a-b)*p1-b*p3;
	  if(z<minz)
	  { minz=z;
		p11=p1;
		p33=p3;
	  }
	 p1=p1+0.01;

	}
  p3=p3+0.01;
  }
 p1=p11;
 p3=p33;
 p2=-p1-p3;
 return p1,p2,minz;
}
float fx()
{x1=x[0][0];
 x2=x[1][0];
 f=x1*x1+2*x2*x2-4*x1-2*x1*x2;
 return f;
}
float fx1()
{x1=x[0][0];
 x2=x[1][0];
 fx11=-2*x1+2*x2+4;
 return fx11;
}
float fx2()
{x1=x[0][0];
 x2=x[1][0];
 fx12=-4*x2+2*x1;
 return fx12;
}
float finda()
{  a=-10;
   while(x[0][0]+x[1][0]+a*fx11+a*fx12<=6)
	 { a=a+0.01;
	 }
   //	a=a-0.005;
   return a;
}

⌨️ 快捷键说明

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