共轭梯度法求三元函数极小值
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout<<"迭代次数为:\t"<<k+1<<endl;
/*//----------------以下是测试部分
Vector v1(1,2,0),v2(1,2,3),v3(3,1,2),v4,v5,v6,v7(0,3,4);double n;
Vector v_arry[133]={v1,v2,v3};
}
double GetModulus(Vector &p)
{ቤተ መጻሕፍቲ ባይዱ
return sqrt(p.x1*p.x1+p.x2*p.x2+p.x3*p.x3);
}
/*double GetFValue(double la) //求函数值f(x[k]+lamda*s[k])
{
return ValueFunction(x[k]+la*s[k]);
la0=la1;
h=h*2;
goto step12;
}
else
{
//cout<<"f1>f0"<<endl;
if(fabs(h)<e)
{
lamdak=la0;
//cout<<"|h|为:"<<fabs(h)<<endl;
//cout<<"e为:"<<e<<endl;
//cout<<"达到结束条件:|h|<e,计算结束。"<<endl;
double f1,f0,la1,la0=1,h=10,e=0.0000001;
step12: la1=la0+h;
f1=ValueFunction(x[k]+la1*s[k]);
f0=ValueFunction(x[k]+la0*s[k]);
if(f1<f0)
{
//cout<<"f1<f0"<<endl;
#include<iostream.h>
#include<math.h>
class Vector
{
public:
Vector(){x1=0;x2=0;x3=0;}
Vector(double xx1,double xx2,double xx3){x1=xx1;x2=xx2;x3=xx3;}
friend Vector operator + (Vector v1,Vector v2);
{
return p.x1*p.x1-2*p.x1*p.x2+2*p.x2*p.x2+p.x3*p.x3-p.x2*p.x3+2*p.x1+3*p.x2-p.x3;
}
Vector GradFuction(Vector &p)//求梯度的函数,返回值为一个向量
{
return Vector(2*(p.x1-p.x2)+2,-2*p.x1+4*p.x2-p.x3+3,2*p.x3-p.x2-1);
}*/
void main()
{
int n=3;//本题为三维问题
double ValueFunction(Vector &p);
Vector GradFuction(Vector &p);
Vector startpoint(0,0,0);
Vector x[10000]={startpoint},g[10000],s[10000];double lamda[10000],lamdak;
friend Vector operator - (Vector & v1,Vector & v2);
friend Vector operator - (Vector & v1);
friend double operator * (Vector & v1,Vector & v2);
friend Vector operator * (double c,Vector & v);
goto step15;
}
else
{
//cout<<"|h|>e"<<endl;
h=-h/4;
goto step12;
}
}
step15: cout<<"极小值点为:lamdak="<<lamdak<<endl;
//cout<<"极值为:f(x)min="<<GetFValue(xx)<<endl;
x[k+1]=x[k]+lamdak*s[k];
step5:{
if (k<n-1)
s[k+1]=-g[k+1]+(pow(GetModulus(g[k+1]),2)/pow(GetModulus(g[k]),2))*s[k];
k++;
goto step3;
if (k==n-1)
{
x[0]=x[n];
goto step2;
}
}
step6: cout<<"程序结束,求得极小点为:\t";x[k+1].display();
cout<<"带入lamdak求得"<<"x["<<k+1<<"]点为\t";
x[k+1].display();
g[k+1]=GradFuction(x[k+1]);
cout<<"x["<<k+1<<"]点的梯度为\t";g[k+1].display();
}//step3结束
step4: {if (GetModulus(g[k+1])<precision) goto step6 ;else goto step5;}
//int ia[]={};
int l=45;v3=v1+v2;
v_arry[0]=v3;
//v3=GradFuction(v1);
n=ValueFunction(v1);
GradFuction(v1).display();
v_arry[0].display();
v4=-v2;
v5=v1-v2;
v6=-v1-v2;
friend Vector operator * (Vector & v,double c);
~Vector(){}
void display();
//private:
double x1,x2,x3;
};
Vector operator + (Vector v1,Vector v2)
{
return Vector(v1.x1+v2.x1,v1.x2+v2.x2,v1.x3+v2.x3);
}
double operator * (Vector & v1,Vector & v2)
{
return (v1.x1*v2.x1+v1.x2*v2.x2+v1.x3*v2.x3);
}
Vector operator * (double c,Vector & v)
{
return Vector(c*v.x1,c*v.x2,c*v.x3);
cout<<n<<endl;
v3.display();
v4.display();
v5.display();
v6.display();
cout<<ValueFunction(x[k]+lamdak*s[k])<<endl;
cout<<GetModulus(v7);
*/
}
}
Vector operator * (Vector & v,double c)
{
return Vector(c*v.x1,c*v.x2,c*v.x3);
}
void Vector::display()
{
cout<<"("<<x1<<","<<x2<<","<<x3<<")"<<endl;
}
double ValueFunction(Vector &p)//求某点处函数值的函数,返回值为一个double型数
}
Vector operator - (Vector & v1,Vector & v2)
{
return Vector(v1.x1-v2.x1,v1.x2-v2.x2,v1.x3-v2.x3);
}
Vector operator - (Vector & v1)
{
return Vector(-v1.x1,-v1.x2,-v1.x3);
int k;
cout<<"选取初始点为:x[0]= ";x[0].display();
double precision=0.000001;
step2:{g[0]=GradFuction(x[0]);s[0]=-g[0];k=0;}
step3:{
double GetFValue(double la);
/*//----------------以下是测试部分
Vector v1(1,2,0),v2(1,2,3),v3(3,1,2),v4,v5,v6,v7(0,3,4);double n;
Vector v_arry[133]={v1,v2,v3};
}
double GetModulus(Vector &p)
{ቤተ መጻሕፍቲ ባይዱ
return sqrt(p.x1*p.x1+p.x2*p.x2+p.x3*p.x3);
}
/*double GetFValue(double la) //求函数值f(x[k]+lamda*s[k])
{
return ValueFunction(x[k]+la*s[k]);
la0=la1;
h=h*2;
goto step12;
}
else
{
//cout<<"f1>f0"<<endl;
if(fabs(h)<e)
{
lamdak=la0;
//cout<<"|h|为:"<<fabs(h)<<endl;
//cout<<"e为:"<<e<<endl;
//cout<<"达到结束条件:|h|<e,计算结束。"<<endl;
double f1,f0,la1,la0=1,h=10,e=0.0000001;
step12: la1=la0+h;
f1=ValueFunction(x[k]+la1*s[k]);
f0=ValueFunction(x[k]+la0*s[k]);
if(f1<f0)
{
//cout<<"f1<f0"<<endl;
#include<iostream.h>
#include<math.h>
class Vector
{
public:
Vector(){x1=0;x2=0;x3=0;}
Vector(double xx1,double xx2,double xx3){x1=xx1;x2=xx2;x3=xx3;}
friend Vector operator + (Vector v1,Vector v2);
{
return p.x1*p.x1-2*p.x1*p.x2+2*p.x2*p.x2+p.x3*p.x3-p.x2*p.x3+2*p.x1+3*p.x2-p.x3;
}
Vector GradFuction(Vector &p)//求梯度的函数,返回值为一个向量
{
return Vector(2*(p.x1-p.x2)+2,-2*p.x1+4*p.x2-p.x3+3,2*p.x3-p.x2-1);
}*/
void main()
{
int n=3;//本题为三维问题
double ValueFunction(Vector &p);
Vector GradFuction(Vector &p);
Vector startpoint(0,0,0);
Vector x[10000]={startpoint},g[10000],s[10000];double lamda[10000],lamdak;
friend Vector operator - (Vector & v1,Vector & v2);
friend Vector operator - (Vector & v1);
friend double operator * (Vector & v1,Vector & v2);
friend Vector operator * (double c,Vector & v);
goto step15;
}
else
{
//cout<<"|h|>e"<<endl;
h=-h/4;
goto step12;
}
}
step15: cout<<"极小值点为:lamdak="<<lamdak<<endl;
//cout<<"极值为:f(x)min="<<GetFValue(xx)<<endl;
x[k+1]=x[k]+lamdak*s[k];
step5:{
if (k<n-1)
s[k+1]=-g[k+1]+(pow(GetModulus(g[k+1]),2)/pow(GetModulus(g[k]),2))*s[k];
k++;
goto step3;
if (k==n-1)
{
x[0]=x[n];
goto step2;
}
}
step6: cout<<"程序结束,求得极小点为:\t";x[k+1].display();
cout<<"带入lamdak求得"<<"x["<<k+1<<"]点为\t";
x[k+1].display();
g[k+1]=GradFuction(x[k+1]);
cout<<"x["<<k+1<<"]点的梯度为\t";g[k+1].display();
}//step3结束
step4: {if (GetModulus(g[k+1])<precision) goto step6 ;else goto step5;}
//int ia[]={};
int l=45;v3=v1+v2;
v_arry[0]=v3;
//v3=GradFuction(v1);
n=ValueFunction(v1);
GradFuction(v1).display();
v_arry[0].display();
v4=-v2;
v5=v1-v2;
v6=-v1-v2;
friend Vector operator * (Vector & v,double c);
~Vector(){}
void display();
//private:
double x1,x2,x3;
};
Vector operator + (Vector v1,Vector v2)
{
return Vector(v1.x1+v2.x1,v1.x2+v2.x2,v1.x3+v2.x3);
}
double operator * (Vector & v1,Vector & v2)
{
return (v1.x1*v2.x1+v1.x2*v2.x2+v1.x3*v2.x3);
}
Vector operator * (double c,Vector & v)
{
return Vector(c*v.x1,c*v.x2,c*v.x3);
cout<<n<<endl;
v3.display();
v4.display();
v5.display();
v6.display();
cout<<ValueFunction(x[k]+lamdak*s[k])<<endl;
cout<<GetModulus(v7);
*/
}
}
Vector operator * (Vector & v,double c)
{
return Vector(c*v.x1,c*v.x2,c*v.x3);
}
void Vector::display()
{
cout<<"("<<x1<<","<<x2<<","<<x3<<")"<<endl;
}
double ValueFunction(Vector &p)//求某点处函数值的函数,返回值为一个double型数
}
Vector operator - (Vector & v1,Vector & v2)
{
return Vector(v1.x1-v2.x1,v1.x2-v2.x2,v1.x3-v2.x3);
}
Vector operator - (Vector & v1)
{
return Vector(-v1.x1,-v1.x2,-v1.x3);
int k;
cout<<"选取初始点为:x[0]= ";x[0].display();
double precision=0.000001;
step2:{g[0]=GradFuction(x[0]);s[0]=-g[0];k=0;}
step3:{
double GetFValue(double la);