牛顿下山法C语言实现,供大家用用
//x:双精度实型变量指针,指向变量中存放迭代的初值,返回时在该指针只想爱你个的变量村存放终值 //eps:控制精度要求:eps1,eps2是精度要求;eps3是为了防止无休止地细分t而设的;eps4是为处理x0取得太差的情况而设置的,可适当取大点 //t:下山因子,,双精度实型变量 //js:最大迭代次数.不可取太大,防止初值跳跃次数太多 //f:无类型函数指针变量,指向计算方程左端函数f(x)值及其导数值f'(x) 的函数 //可由用户自编,其形式为: // double *f(double x) // { // double y[2]; // y[0]=f(x)的表达式; // y[1]=f'(x)的表达式; // return y; // } #include<math.h> #include<stdio.h> void NewtDownhill(double *x , double eps1 , double eps2 , double eps3 , double eps4 , int js, double (**f)()) { int n=1 , flag=1 ; double t=1.0 , x0=*x , x1 , y[2] , f0 , f1 ; (**f)(x0); //计算f(x0)和f'(x0) f0=y[0] ; x1=x0-t*(y[0]/y[1]) ; //迭代计算x1=x0-f(x0)/f'(x0) (**f)(x1); //计算x1在f的值和f'的值 f1=y[0]; while(n<=js&&flag==1) { if(fabs(x1-x0)<eps1||fabs(f1<eps2)) { printf("n=%d x=%f f(x)=%f" , n , x1 , y[0]) ; flag=0 ; } if(fabs(f1)<fabs(f0)) { x0=x1; t=1.0; } if(t>eps3) { t=t/2.0 ; (**f)(x0); //计算f(x0)和f'(x0) f0=y[0] ; x1=x0-t*(y[0]/y[1]) ; //迭代计算x1=x0-f(x0)/f'(x0) (**f)(x1); //计算x1在f的值和f'的值 f1=y[0]; x0=x1+eps4; n++; } } if(n>js) printf("Method fail after js iterations"); }
- siclj62015-07-17用excel了,没用上
- kawargmail2013-05-17还可以,正好需要,谢谢。
- 粉丝: 3
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助