《非线性方程组-最速下降法(梯度法).docx》由会员分享,可在线阅读,更多相关《非线性方程组-最速下降法(梯度法).docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上梯度法(又名,最速下降法)(该法总可以收敛,但是,在接近真解时收敛的速度会放慢。)梯度法又称为最速下降法,用于求解实系数非线性方程组 (715)的一组根。梯度法首先是定义一个目标函数 (716)使目标函数达到最小的是我们寻找的一组解,这是非线性最小二乘法问题。如果第步求得一组解,使得 (717)则认为是原方程组满足一定精度的要求的一组解。梯度法的计算过程是:(1)先给定一组不全为零的初值,第k步的一组根为;(2)计算目标函数的值;(单独子程序:fn =TargetFunction)(3)若,则认为是满足一定精度的一组解,否则,作如下修正计算 (718)其中 (719)
2、H为控制收敛的常数,通常选为(105106),收敛精度选为(106108)。(4)重复修正,直到,计算终止。set initial values of Xii=1,2,n计算目标函数Stop图73 最速下降法计算框图对应的计算程序代码为C语言编程,据称该程序经Turboc 2.0编译通过。/* grad1.c 程序段名称A system of non-linear equations is solved by using gradient method 梯度法解非线性方程组例题3*X1-cos(X2*X3)-0.5=0X12-81*(X2+0.1)2+sin(X3)+1.06=0exp(-X1
3、*X2)+20+X3+(10*PI-3)/3=0#include 主程序头,包含数学头main()int i , j ,n = 3; 定义整型数据,并给定方程个数,n值double y4, x4=0.0,0.5,0.5,0.5; 公用数据的定义,初始化根和变量double eps = 1.e-08; 精度要求,以上数据在newton函数中需要用newton(n,x,y,eps); 调用牛顿子程序printf(“The solutions of non-linear equationsn”); 制表、划线pri_line(45);(for (i=1; i=n; i+) 显示迭代结果printf(
4、“ x%1d=%12.6ftf%1d=%12.6En”,i,xi,i,yi);pri_line(45); 主程序段结束double fn(n,x,y) 定义函数fn(),计算目标函数值平方加和值并返回int n; double x, y; 公用数据接口有2个矩阵和n int i; double s2=0.0; 定义数据,s2为目标函数加和y1=3.0*x1-cos(x2*x3-0.5; 构建方程组,并求值y2=x1*x1-81.0*(x2+0.1)*(x2+0.1)+sin(x3)+1.06;y3=exp(-x1*x2+20.0*x3+(10*M_PI-3.0)/3.0;for (i=1; i
5、=n ; i+)s2+= yi*yi; 计算目标函数值平方的加和return(s2); 返回计算结果newton ( n, x, y, eps ) 牛顿子程序int n; double x , y , eps; 公用数据申明,这些数据为已知 int i; double s4, s0, s1, s2, t, alpha, h=1.e-05; 自用数据定义 s4 = 序列 s0 = 目标函数值 s1 = = s1+=si*si; s2 = t = xi 值的临时存放单元 while (1) while do循环体 s2 = fn(n,x,y); 调用目标函数计算s0 = s2; 保留k值时的给新的
6、目标函数值让位if (s0eps) break; 判断是否已经求解出了根s1=0.0; 当未求解出根的时候继续迭代for ( i=1; i=n; i+) for()t = xi; 保留x(k)xi = (1.0+h)*t; 计算 (xi+hi)和s2, ,s2 = fn(n, x, y); 针对(xih)计算目标函数值si = (s2-s0) / (h*t); s 序列的值在循环体外要使用,所以要有固定的数组变量来存放求导数值s1+=si*si; 导数平方值加和=xi=t; 将新的赋给x(k+1),alpha = s0/s1; 得到alpha新值for (i=1; i=n; i+) 循环求向量序列xi = xi - alpha*si ; 得到修正后的xi序列; 为再一次的调用fn( )做准备. while do循环终点 Newton( )结束pri_line(int n) 划线子程序 int i;for (i=0 ; in ; i+)printf(“%c”,0xc4);printf(“n”);专心-专注-专业