最优化方法课程实验报告 下载本文

下载可编辑

result =t; } } } int main() {

double a = 0.0; double b = 3.0; double x= newton(a,b);

cout<<\求解的结果是 x = \ cout<<\此时f(x) = \ return 0; }

附录4

#include #include using namespace std; double fun(double t) {

return (t*t+2*t); }

void Goldensection(double(*pfun)(double t)) {

int maxflag=1000,k=1;

double a=-3,b=5,err=0.001,t,t1,t2; do {

t1=a+0.618*(b-a); t2=b-0.618*(b-a); if(t1=t2){a=t2;b=t1;} else {if(t1

}while(fabs(a-b)>err&&k=maxflag)

cout<

t=(a+b)/2;

cout<

cout<<\迭代结果:近似根为root=\函数值近似为:f(root)=\}

int main() { .专业.整理.

下载可编辑

Goldensection(fun); return 0; }

附录5

#include #include using namespace std; double fun(double x) {

return (8*x*x*x-2*x*x-7*x+3); }

double max(double a,double b) {

if(a>b)return a; else return b; }

double min(double a,double b) {

if(a>b)return b; else return a; }

void Parainterpolation(double(*pfun)(double x)) { double a=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)*f

un(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<<\函数值近似为:\}

int main() {

Parainterpolation(fun); return 0; }

附录6

#include #include

double lamda(double x[2],double p[2],double a[2]) { double lam1,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)); double s;

s=-lam2/(2*lam1); return s; }

void main() {

cout<<\最速下降法求解最优解程序运行结果\ cout<

double lamd,x[3],a[6];

double p[2],g[2],e,y,m,n; int i=0; cout<<\请输入精度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<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<<\的模为:\ cout<<\的值\

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<<\

cout<<\ cout<<\满足进度要求所得的最优值为:\cout<<\ }

附录7

#include

#include\矩阵的有关运算 int const n1=2;

double f(double *x);//目标函数;

void g(double *x,double *y);//目标函数的梯度; void main() {

int i;

double x0[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;i

x1[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

.专业.整理.