修正牛顿法求解非约束问题_C程序编程.docx
上传人:qw****27 上传时间:2024-09-12 格式:DOCX 页数:6 大小:109KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

修正牛顿法求解非约束问题_C程序编程.docx

修正牛顿法求解非约束问题_C程序编程.docx

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

一题目利用修正牛顿法求函数f(x1,x2)=4(x1+1)^2+2(x2-1)^2+x1+x2+10的极小值点。二修正牛顿法基本思想:给定初始点,收敛精度,置。计算、、和求,其中为沿进行一维搜索的最佳步长。检查收敛精度。若,则,停机;否则置,返回步骤2,继续进行进行搜索。改进后的修正牛顿法程序框图如下:三用修正牛顿法求函数程序如下:#include<stdio.h>#include<math.h>#include<conio.h>#include<iostream>doublefun1(doubleq1,doubleq2){return(pow((q1+1),2)*4+2*pow((q2-1),2)+q1+q2+10);}doublefun2(doubleg,doublex,doubley,doubler1,doubler2){return(pow((x+g*y+1),2)*4+pow(((r1+g*r2)-1),2)*2+(x+g*y)+(r1+g*r2)+10);}voidmain(){doubleA[2][1],B[2][2],C[2][1],D[2][1],X[2][1];doubleE[2][1]={0,0};//¡ä¨²¦Ì?3?¨º?¦Ì?x0intt=0,i=0,j=0;doubleE0,x1,x2,x3,h(0.1);doubley1,y2,y3,m;doublea,b,k=0.618,a1,a2,f1,f2;printf("输入收敛度");std::cin>>E0;do{D[0][0]=E[0][0];D[1][0]=E[1][0];A[0][0]=8*D[0][0]+0*D[1][0]+9;A[1][0]=0*(D[0][0]+4*D[1][0])-3;B[0][0]=0*D[0][0]+0*D[1][0]+0.125;B[0][1]=0*D[0][0]+0*D[1][0]+0;B[1][0]=0*D[0][0]+0*D[1][0]+0;B[1][1]=0*D[0][0]+0*D[1][0]+0.25;//B[0][0],B[0][1],B[1][0],B[1][1]为海森矩阵的逆C[0][0]=-(B[0][0]*A[0][0]+B[0][1]*A[1][0]);C[1][0]=-(B[1][0]*A[0][0]+B[1][1]*A[1][0]);x1=0;x2=x1+h;y1=fun2(x1,D[0][0],C[0][0],D[1][0],C[1][0]);y2=fun2(x2,D[0][0],C[0][0],D[1][0],C[1][0]);if(y2>y1){h=-h;x3=x1,y3=y1;x1=x2,y1=y2;x2=x3,y2=y3;}x3=x2+h;y3=fun2(x3,D[0][0],C[0][0],D[1][0],C[1][0]);while(y3<y2){h=2*h;x1=x2,y1=y2;x2=x3,y2=y3;x3=x2+h;y3=fun2(x3,D[0][0],C[0][0],D[1][0],C[1][0]);i++;}a=x1;b=x3;a1=b-k*(b-a);a2=a+k*(b-a);f1=fun2(a1,D[0][0],C[0][0],D[1][0],C[1][0]);f2=fun2(a2,D[0][0],C[0][0],D[1][0],C[1][0]);do{if(f1>=f2){a=a1;a1=a2;f1=f2;a2=a+k*(b-a);f2=fun2(a2,D[0][0],C[0][0],D[1][0],C[1][0]);}else{b=a2;a2=a1;f2=f1;a1=b-k*(b-a);f1=fun2(a1,D[0][0],C[0][0],D[1][0],C[1][0]);}j++;}while(fabs((b-a)/b)>=E0&&fabs((f2-f1)/f2)>=E0);m=0.5*(a+b);//m?aE[0][0]=D[0][0]+m*C[0][0];E[1][0]=D[1][0]+m*C[1][0];printf("%d%15f10%15f10\n",t,E[0][0],E[1][0],fun1(E[0][0],E[1][0]));t++;}while(fabs(E[0][0]-D[0][0])>=E0&&fabs(E[1][0]-D[1][0])>=E0);X[0][0]=E[0][0];X[1][0]=E[1][0];printf("迭代了%