成功失败法程序代码_第1页
成功失败法程序代码_第2页
成功失败法程序代码_第3页
成功失败法程序代码_第4页
成功失败法程序代码_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、结果有点错误工程优化 课程实验报告一、实验目的一、实验目的1. 了解成功-失败法相关知识;2. 了解黄金分割法相关知识;3. 掌握C语言编程实现算法。1、实验原理1. 成功-失败法基本思想:对f(x)任选一个初始点x0及初始步长h,通过比较这两点函数值的大小, 确定第三点位置,比较这三点的函数值大小,确定是否为“高一低一高”形态(1) 选定初始点a,初始步长h = hO,计算y1 = f(a1) , y2= f(a1 + h)(2) 比较y1和y2。(a) 如 y1>y2,向 右前进;加大步长 h = 2 h,转(3)向前;(b) 女口 y1<y2,向 左后退;h= hO,将al

2、与a2,y1与y2的值互换。转(3) 向后探测;(c) 如 y1 = y2,极 小点在al和a1 + h之间。 (3 )产生新的探测点a3= al + h,y3= f(a3);比较函数值y2与y3:(a) 如y2>y3,加大步 长 h = 2 h ,a仁 a2,a2=a3,转(3) 继续探测。(b) 如y2<y3,则初始区间得到:a=mina1,a3, b=maxa3,a1,函数最小值所在的区间为a,b。2. 黄金分割法黄金分割法适用于a,b区间上的任何单股函数求极小值问题,对函数除要 求“单谷”外不做其他要求,甚至可以不连续。因此,这种方法的适应面非常广。 黄金分割法也是建立在区

3、间消去法原理基础上的试探方法,即在搜索区间a,b内适当插入两点a1, a2,并计算其函数值。a1, a2将区间分成三段,应用函数 的单谷性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。然 后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。Xi =<?十 0.382(5? a) 了(利)z2 =a +0.618(i-dt) _/%)子(吵Ai - ij*可-兀Ji" y?可=a + 0.382(b - afY = /(册)0口 r计召呵,ft 启* 砒=审+。£18辿-必去4N*-'1、实验内容1.

4、给定函数 f(x)=xA4+xA3-xA2+1;(其中&取 0.01 )2. 通过C语言编程实现算法;3. 利用成功-失败法取得其可能极值存在区间a,b;4. 利用黄金分割求出极值点(A)。三、实验过程或算法(源程序)/ prj2.cpp :定义控制台应用程序的入口点/#include "stdafx.h" fx=x*x*x*x+x*x*x-x*x+1 err=0.01#define X 1#define length 1#define error 0.01struct nodefloat coe; 系数 int index;/ 指数 struct node *ne

5、xt;struct node* head;struct node *creat(int n)/n个单项式组成的多项式int i;struct node *head, *pnew, *pend;pnew = (struct node *)malloc( sizeof(struct node);/头节点printf("请输入系数和指数:n"); scanf("%f%d" , &pnew->coe, &pnew->index); head = pend = pnewfor (i = 1; i < n; i+) /已经创建过一个

6、头节点,i从1开乐始pnew = (struct node *)malloc( sizeof(structnode);scanf('%f%d" , &pnew->coe,&pnew->index);pend->next = pnew; pend = pnew;pend->next = NULL ;/尾指针成员为空return head void print(struct node * head)struct node *p = head;int i;printf( "f(x)=");while (p != NULL

7、)printf( "%f" , p->coe);for (i = 0; i < p->index; i+)p = p->next;if (p!=NULL ) printf("+");printf( "n");double calculate(double x)int i;double w;double sum = 0.0;struct node * p = head; while (p != NULL )w = 1.0;sum = sum + (p->coe)*w;void suc_fail( doubl

8、e x, double h, double err,double *x1 ,double *x2)double f1, f2;*x1 = *x2 = x;fl = calculate(x);while (fabs(h) >= err)*x1 = x + h;f2 = calculate(* x1);if (f2 <= f1)h = 2 * h;*x2 = *x1 + h;fl = f2;elseh = -h / 4; continuex = *x1;*x2 = x;double golden_section_method(double a, doubleb,double err)d

9、ouble x1, x2;double fl, f2;x2 = a + 0.618*( b - a);x1 = a + (b - x2);fl = calculate(xl);f2 = calculate(x2);while (fabs(b - a) < err)if (f1 > f2)double x=X;/ 未知数double a, b;double best ans/ 最优解printf("请输入两个数,用来保存成功失败法的double f1,f2;/ 函数值区间:");scanf("%f%f" , &a, &b);a

10、= x1;x1 = x2f1 = f2;x2 = b - (x1 - a);f2 = calculate(x2);elseb = x2;x2 = x1f2 = f1;double *x1,*x2; /确定区间 x1 = &a;x2= &b;printf("请输入单项式的个数:");scanf("%d", &n);head = creat(n);calculate(x);suc fail(x, length, error,x1,x2);x1 = a + (b - x2); f1 = (calculate(x1);printf(&qu

11、ot;成功失败法所求区间:”);(*x1 < *x2)? printf( "%f %fn" , *x1, *x2):printf( "%f %fn" , *x2, *x1);return (a + b) / 2;int _tmain(int argc, _TCHAR * argv)best ans=golden section method(*x1, *x2, error);printf("精度为 error=%f 最优解:%fn", error,best_ans);return 0;int n;四、实验结果CWI NDOW5syrtem32cmd.exe一 X幘输入两个数,用來保存成功败法的区间:1 2请输入单项式的个数:4请输入系

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论