您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 非线性方程组-最速下降法(梯度法)
梯度法(又名,最速下降法)(该法总可以收敛,但是,在接近真解时收敛的速度会放慢。)梯度法又称为最速下降法,用于求解实系数非线性方程组12(,,,)0,1,2,,infxxxin(7-15)的一组根。梯度法首先是定义一个目标函数212121(,,,)(,,,)nninixxxfxxx(7-16)使目标函数21niif达到最小的12,,,nxxx是我们寻找的一组解,这是非线性最小二乘法问题。如果第(0,1,2,)kk步求得一组解12,,,nkkkxxx,使得12(,,,)nkkkxxx(7-17)则认为12,,,nkkkxxx是原方程组满足一定精度的()要求的一组解。梯度法的计算过程是:(1)先给定一组不全为零的初值12000,,,nxxx,第k步的一组根为12,,,nkkkxxx;(2)计算目标函数12(,,,)nkkkxxx的值;(单独子程序:fn=TargetFunction)(3)若12(,,,)nkkkxxx,则认为12,,,nkkkxxx是满足一定精度()的一组解,否则,作如下修正计算1ikiikkkiixxxxx(7-18)其中1212121212121221111222(,,,)(,,,)(,,,)(,,,)(,,,)(,,,)(,,,)*,1,2,,nkjjnnnnnnkkkknjjxxkkkkkkkkkkkkkkkkkknnnkiixxxxxhxxxxxxhxxhxxxxxhxxxhxxxxhhHxin(7-19)H为控制收敛的常数,通常选为(10-5~10-6),收敛精度选为(10-6~10-8)。(4)重复修正1kix,直到12111(,,,)nkkk,计算终止。setinitialvaluesofXii=1,2,…,n计算目标函数2121(,,...,)nkkkniixxxfeps1(1)*kkiixhx21;1,2,...,niiixxin计算导数1kkkiiixxxPrint1,2,...,ixinStop图7-3最速下降法计算框图对应的计算程序代码为C语言编程,据称该程序经Turboc2.0编译通过。/*grad1.c程序段名称Asystemofnon-linearequationsissolvedbyusinggradientmethod梯度法解非线性方程组例题3*X1-cos(X2*X3)-0.5=0X1^2-81*(X2+0.1)^2+sin(X3)+1.06=0exp(-X1*X2)+20+X3+(10*PI-3)/3=0#includemath.h‘主程序头,包含数学头math.hmain(){inti,j,n=3;‘定义整型数据,并给定方程个数,n值doubley[4],x[4]={0.0,0.5,0.5,0.5};‘公用数据的定义,初始化根和变量doubleeps=1.e-08;‘精度要求,以上数据在newton函数中需要用newton(n,x,y,eps);‘调用牛顿子程序printf(“Thesolutionsofnon-linearequations\n”);‘制表、划线pri_line(45);(for(i=1;i=n;i++)‘显示迭代结果printf(“x%1d=%12.6f\tf%1d=%12.6E\n”,i,x[i],i,y[i]);pri_line(45);}‘主程序段结束doublefn(n,x,y)’定义函数fn(),计算目标函数值平方加和值并返回intn;doublex[],y[];‘公用数据接口有2个矩阵和n{inti;doubles2=0.0;‘定义数据,s2为目标函数加和y[1]=3.0*x[1]-cos(x[2]*x[3]-0.5;‘构建方程组,并求值y[2]=x[1]*x[1]-81.0*(x[2]+0.1)*(x[2]+0.1)+sin(x[3])+1.06;y[3]=exp(-x[1]*x[2]+20.0*x[3]+(10*M_PI-3.0)/3.0;for(i=1;i=n;i++)s2+=y[i]*y[i];‘计算目标函数值平方的加和return(s2);‘返回计算结果}newton(n,x,y,eps)‘牛顿子程序intn;doublex[],y[],eps;‘公用数据申明,这些数据为已知{inti;doubles[4],s0,s1,s2,t,alpha,h=1.e-05;‘自用数据定义‘s[4]=[1212(,,,)(,,,)nnkkkkkknnnxxxhxxxxh]序列‘s0=12(,,,)nkkkxxx目标函数值‘s1=21kjjnjjxxx=s1+=s[i]*s[i];‘s2=12(,,,)nkkknxxxh‘t=x[i]值的临时存放单元‘1221(,,,)nkjjkkkknjjxxxxxalphaxwhile(1)‘whiledo循环体{s2=fn(n,x,y);‘调用目标函数计算s0=s2;‘保留k值时的12(,,,)nkkkxxx‘给新的目标函数值让位if(s0eps)break;‘判断是否已经求解出了根s1=0.0;‘当未求解出根的时候继续迭代for(i=1;i=n;i++)‘for(){t=x[i];‘保留x(k)x[i]=(1.0+h)*t;‘计算(xi+hi)和s2,*kiihHx,s2=fn(n,x,y);‘针对(xi+h)计算目标函数值s[i]=(s2-s0)/(h*t);‘s[]序列的值在循环体外要使用,‘所以要有固定的数组变量来存放‘1212(,,,)(,,,)nnkkkkkknnnxxxhxxxxh求导数值s1+=s[i]*s[i];‘导数平方值加和=21kjjnjjxxxx[i]=t;}‘将新的赋给x(k+1),alpha=s0/s1;‘得到alpha新值for(i=1;i=n;i++)‘循环求向量序列x[i]=x[i]-alpha*s[i];‘得到修正后的xi序列;‘为再一次的调用fn()做准备.}‘whiledo循环终点}‘Newton()结束pri_line(intn)‘划线子程序{inti;for(i=0;in;i++)printf(“%c”,0xc4);printf(“\n”);}
本文标题:非线性方程组-最速下降法(梯度法)
链接地址:https://www.777doc.com/doc-4600439 .html