}
intmain()
{
Goldensection(fun);
return0;
}
附录5
#include
#include
usingnamespacestd;
doublefun(doublex)
{
return(8*x*x*x-2*x*x-7*x+3);
}
doublemax(doublea,doubleb)
{
if(a>b)returna;
elsereturnb;
}
doublemin(doublea,doubleb)
{
if(a>b)returnb;
elsereturna;
}
voidParainterpolation(double(*pfun)(doublex)){
doublea=0,b=2,err=0.001,x=0,x0=1,f,f0;
do
{
x=((x0*x0-b*b)*fun(a)+(b*b-a*a)*fun(x0)+(a*a-x0*x0)*fun(b))/(2*((x0-b)*fun(a)+(b-a)*fun(x0)+(a-x0)*fun(b)));
f0=fun(x0);
f=fun(x);
if(f=f0){a=min(x,x0);b=max(x,x0);x0=(a+b)/2;}
else{
if((fun(x)-f0)*(x-x0)>0)
{
b=max(x,x0);x0=min(x,x0);
}
else
{
a=min(x,x0);x0=max(x,x0);
}
}
}while(fabs(x-x0)>err);
x=(x+x0)/2;
cout<<"迭代结果:
"<cout<<"近似根:
"<cout<<"函数值近似为:
"<}
intmain()
{
Parainterpolation(fun);
return0;
}
附录6
#include
#include
doublelamda(doublex[2],doublep[2],doublea[2]){
doublelam1,lam2;
lam1=(pow(a[0],3)*x[0]*x[0]+pow(a[1],3)*x[1]*x[1]);
lam2=-(pow(a[0]*x[0],2)+pow(a[1]*x[1],2));
doubles;
s=-lam2/(2*lam1);
returns;
}
voidmain()
{
cout<<"最速下降法求解最优解程序运行结果"<cout<doublelamd,x[3],a[6];
doublep[2],g[2],e,y,m,n;inti=0;
cout<<"请输入精度e"<>e;
cout<<"请输入初始点x[0],x[1]的值:
\n"<cin>>m;
cin>>n;
x[0]=m;x[1]=n;
cout<<"函数通式为f(x)=a[0]x1*x1+a[1]x2*x2+a[2]x1*x2+a[3]x1+a[4]x2+a[5]"<cout<<"请依次输入函数的系数:
a[0]、a[1]、a[2]、a[3]、a[4]、a[5]:
"<for(i=0;i<6;i++)
cin>>a[i];
p[0]=(2*a[0]*x[0]+a[2]*x[1]+a[3]);
p[1]=(2*a[1]*x[1]+a[2]*x[0]+a[4]);
g[0]=-p[0];g[1]=-p[1];i=0;cout<while(sqrt(g[0]*g[0]+g[1]*g[1])>e&&i<=200){
lamd=lamda(x,g,a);
x[0]=x[0]+lamd*g[0];
x[1]=x[1]+lamd*g[1];
p[0]=2*a[0]*x[0];
p[1]=2*a[1]*x[1];
g[0]=-p[0];
g[1]=-p[1];
i++;
cout<<"******************************************"<cout<<"第"<
"<cout<<"p的模为:
"<cout<<"x的值"<cout<<"******************************************"<cout<}
y=(a[0]*x[0]*x[0]+a[1]*x[0]*x[1]+a[2]*x[0]*x[1]+a[3]*x[0]+a[4]*x[1]+a[5]);
cout<<"此时满足精度要求的p的模为:
"<cout<cout<<"满足精度的最优近似结果x[1],x[2]分别为:
"<cout<<"x[1]="<cout<<"x[2]="<cout<<"满足进度要求所得的最优值为:
"<cout<<"minf(x)="<}
附录7
#include
#include"matrix.h"//矩阵的有关运算
intconstn1=2;
doublef(double*x);//目标函数;
voidg(double*x,double*y);//目标函数的梯度;
voidmain()
{
inti;
doublex0[n1],x1[n1],g0[n1],g1[n1],H[n1][n1],h[n1][n1],p[n1],f0,f1,temp,e;
x0[0]=0;x0[1]=0;e=0.01;H[0][0]=2;H[0][1]=-1;H[1][0]=-1;H[1][1]=2;
f0=f(x0);
g(x0,g0);
matrix_inv(H,h);
matrix_mul(h,g0,p);
//matrix_minus(x0,p,x1);
for(i=0;ix1[i]=x0[i]-p[i];
g(x1,g1);
f1=f(x1);
temp=g1[0]*g1[0]+g1[1]*g1[1];
while(temp>e)
{
for(i=0;i{
x0[i]=x1[i];
g0[i]=g1[i];
}
f0=f1;
matrix_mul(h,g0,p);
for(i=0;ix1[i]=x0[i]-p[i];
g(x1,g1);
f1=f(x1);
temp=g1[0]*g1[0]+g1[1]*g1[1];
}
cout<<"当X取X("<}
doublef(double*x)
{
return60-10*x[0]-4*x[1]+x[0]*x[0]+x[1]*x[1]-x[0]*x[1];
}
voidg(double*x,double*y)
{
y[0]=2*x[0]-x[1]-10;
y[1]=2*x[1]-x[0]-4;
}
附录8
#include
#include
#include
#definen2//正定二次函数的自变量个数
doublefun(doublex[n],doublef_xs[n+n+1+(n-1)*n/2])//输入变量为函数自变量初值
{
inti,j;
doublef=0;
for(i=0;i{
f+=pow(x[i],2)*f_xs[i];
}
for(;i<2*n;i++)//计算X部分
{
f+=x[i%n]*f_xs[i];
}
f+=f_xs[i];//计算常数项部分
for(i=0;i{
for(j=i+1;j{
f+=f_xs[(n+1)+n*(i+1)-i*(i+1)/2+j-i-1]*x[i]*x[j];
}
}
returnf;
}
voidQ_fun(doublef_xs[n+n+1+(n-1)*n/2],doubleQ[n][n+1])
{
inti,j;
for(i=0;i{
Q[i][i]=2*f_xs[i];
}
for(i=0;i{
Q[i][n]=f_xs[n+i];
}
for(i=0;i{
for(j=i+1;j{
Q[j][i]=Q[i][j]=f_xs[(n+1)+n*(i+1)-i*(i+1)/2+j-i-1];
}
}
}
voidD_fun(doublex[n],doubleQ[n][n+1],doubleg0[n])//自变量初值,正定二次函数的各项系数,返回梯度的初值
{
inti,j;
for(i=0;i{
g0[i]=0;//清零
for(j=0;j{
if(i==j)
g0[i]+=Q[i][j]*x[j];
else
g0[i]+=Q[i][j]*x[j];
}
}
for(i=0;i{
g0[i]+=Q[i][n];
}
cout<for(i=0;icout<co