黄金分割法的参数优化设计_第1页
黄金分割法的参数优化设计_第2页
黄金分割法的参数优化设计_第3页
黄金分割法的参数优化设计_第4页
黄金分割法的参数优化设计_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

目 录 1 绪论 . 1 1.1 研究误差的意义 . 1 1.2 研究误差的目的 . 1 1.3 主要的研究范围 . 1 2 误差的基本概念 . 1 2.1 误差的定义及表示方法 . 1 2.1.1 误差的定义 . 2 2.1.2 误差的表示 . 2 2.2 误差的来源及分类 . 2 2.2.1 误差的来源 . 2 2.2.2 误差的分类 . 3 2.3 精度的基本概念 . 3 2.4 有效数字及数据运算 . 4 2.4.1 有效数字的概念 . 4 2.4.2 有效数字舍入规则 . 4 2.4.3 数据运算规则 . 4 3 黄金分割法的基本思想 . 5 4 误差的分析 . 6 4.1 算法对精度的影响 . 6 4.2 e 对精度的影响 . 10 4.3 区间变化产生的原因 . 12 4.4 N( 0.618) 对精度的影响 . 14 5 小结 . 24 致谢 . 25 参考文献 . 26 1 1 绪论 1.1 研究 误差的意义 人类为了认识自然与改造自然,需要不断地对 自然界的各种现象进行测量和研究。由于实验方法和实验设备的不完善,周围环境的影响,以及受人们认识能力所限等,测量和实验所得数据和被测量的真值之间,不可避免地存在着差异,这在数值上即表现为误差。随着科学技术的日益发展和人们认识水平的不断提高,虽可将误差控制得愈来愈小,但终究不能完全消除它。误差存在的必然性和普遍性,已为大量实践所证明。为了充分认识并进而减小或消除误差,必须对测量过程和科学实验中始终存在着的误差。 研究误差的意义: ( 1) 正确认识误差的性质,分析误差产生的原因,以消除或减小误差。 ( 2) 正确处理测 量和实验数据,合理计算所得结果,以便在一定条件下得到更接近真实的数据。 ( 3) 正确组织实验过程 ,合理设计仪器或选用仪器和测量方法,以便在最经济条件下,得到理想的结果。 1.2 研究误差的目的 在周围的一切事物 的测量以及计算中,都会存在误差。误差的存在不仅会使计算结果出现很大的 误差,还有可能导致结果的偏差甚至不正确。因此研究误差的目的如下: ( 1) 认清影响误差的各种因素,正确分析误差对计算结果的影响。 ( 2) 分析误差的来源。 ( 3) 提高误差的精度,使结果尽量接近真实值 。 1.3 主要的研究范围 本论 文主要研究的是黄金分割法在用计算机计算时所存在的误差。主要解决的是: ( 1) 影响 黄金分割法 计算结果精度的因素; ( 2) 黄金分割法 误差的产生原因; ( 3) 提高黄金分割法计算精度的 主要解决方法。 黄金分割法应用广泛,对其误差的研究具有重要的意义。提高其计算结果的精度,能在以后的工业生产发挥重要的作用。 2 误差的基本 概念 2.1 误差的定义及表示方法 2 2.1.1 误差的定义 所谓误差就是测得值与被侧值的真值之间的差,可用下式表示: 误差 =测得值 -真值 ( 2-1) 测量误差可用绝对误差表示,也可用相对误差表示。 2.1.2 误差的表示 ( 1) 绝对误差 某量值的测得值与真值之差为绝对误差,通常简称为误差,即 绝对误差 =测得值 -真值 ( 2-2) 由式( 2-2)可知,绝对误差可能是正值或负值。 所谓真值就是值在观测一个量时,该量本身所具有的真实大小。量的真值是一个理想的概念,一般是不知道的。但在,某些特定情况下又是可知的。为了实际的需要,在实际测量中,常用被测量的实际值来代替真值,而实际值的定义是满足规定 精确度的用来代替真值使用的量值。 在实际工作中,经常使用修正值。为消除系统误差用代数法而加到测量结果上的值称为修正值。将测得值加上修正值后可得近似的真值,即 真值 =测得值 +修正值 ( 2-3) 由此得 修正值 =真值 -测得值 ( 2-4) 修正值与误差的大小相等而符号相反,测得值加修正值后可以消除该误差的影响。但必须注意一般情况下难以得到真值,因为修正值本身也有误差,修正后只能得到较测得值更为准确的结果。 ( 2) 相对误差 绝对误差与被测值的真值之比称为相对误差。因测得值与真值接近,故也可以近似用绝对误差与测得值之比作为相对误差,即 相对误差 =绝对误差 /真值 =绝对误差 /测得值 ( 2-5) 由于绝对误差可能为正值或负值,因此相对误差也可能为正值或负值。 ( 3) 引用误差 所谓引用误差指的是一种简化和实用方便的仪器仪表表示值的相对误差,它是以仪器仪表某一刻度点的示值误差为分子,一测量范围上限值或全量程为分母,所得的比值称为引用误差。即 引用误差 =示值误差 /测量范围上限 ( 2-6) 2.2 误差的来源 及分类 2.2.1 误差的来源 3 在测量过程中,误差产生的原因可归纳为以下几个方面: ( 1) 测量装置误差 测量装置误差又可以分为以下几类: 1) 标准量具误差 ; 2) 仪器误差 ; 3) 附件误差 。 ( 2) 环境误差 ; ( 3) 方法误差 ; ( 4) 人员误差 。 2.2.2 误差的分类 按照误差的特点与性质,误差可分为系统误差、随机误差(也称偶然误差)和粗大误差三类。 ( 1) 系统误差 在同一条件下,多次测量同一量值时,绝对值和符号保持不变,或在条件改变时,按一定 规律变化的而误差称为系统误差。 ( 2) 随即误差 在同一测量条件下,多次测量同一量值时,绝对值和符号以不可预定的方式便哈误差称为随即误差。 ( 3) 粗大误差 超出在规定条件下预期的误差称为粗大误差,或称为 “寄生误差 ”。此误差值较大,明显歪曲测量结果,如测量时对错了标志,读错或记错了数、使用有缺陷的仪器以及在测量时因操作不细心而引起的过失性误差等。 上面三种在一定条件下可以相互转化,必须注意。总之,系统误差和随机误差之间并不存在绝对的界限。随着误差性质认识的深化和测量技术的发展,有可能把过去作为随机误差的某些误差 分离出来作为系统误差处理,或把某些系统误差当作随机误差来处理。 2.3 精度 的基本概念 反映测量结果与真值接近程度的量,称为精度,它与误差的大小相对应,因此可用误差的大小来表示精度的高低,误差小则精度高,误差大则精度低。 精度可分为 ( 1) 准确度 它反映测量结果中系统误差的影响程度。 ( 2) 精密度 它反映测量结果中随机误差的影响程度。 4 ( 3) 精确度 它反映测量结果中系统误差和随机误差综合的影响程度,其定量的、特性可用测量的不确定度(或极限误差)来表示。 2.4 有效数字及数据运算 在测量结果和数据运算中 ,确定用几位数字来表示测量或数据运算的结果,是一个十分重要的问题。测量结果既然包含有误差,说明它是一个近似数,其精度有一定限度,在测量结果的数据位数或进行数据运算时的取值多少时,皆应以测量所能达到的精度为依据。如果认为不论测量结果的精度如何,在一个数值中小数点后面的位数愈多,这个数值就愈精确;或者在数据运算中,保留的位数愈多,精度就愈高,这种认识都是片面。一方面是因为小数点位置决定不了精度,它仅与采取的单位有关,而小数点位置则不同。另一方面,测量结果的精度与测量方法及仪器有关,在记录或数据运算时所取的数据位 数,其精度不能超过测量所能达到的精度;反之,若低于测量精度,也是不正确的,因为它将损失精度。 2.4.1 有效数字 的概念 含有误差的任何近似数,如果其绝对误差界是最末位数的半个单位,那么从这个近似数左方起的第一个非零的数字,称为第一位有效数字。从第一位有效数字起到最末一位数字止的所有有效数字。 2.4.2 有效 数字舍入规则 对于位数很多的近似数,当有效位数确定后,其后面多余的位数应予舍去,而保留的有效字最末一位数字应按下面的舍入规则进行凑整。 ( 1) 若舍去部分的数值,大于保留部分的末位的半个单位,则末位加 1; ( 2) 若舍去部分的数值,小于保留部分的位数的半个单位,则末位不变; ( 3) 若舍去部分的数值,等于保留部分的末位的半个单位,则末位凑成偶数,即当末位为偶数时则末位不变,当末位为奇数则末位加 1。 2.4.3 数据运算规则 在近似数运算中,为了保证最后结果有尽可能高的精度,所有参与运算的数据,在有效数字后可多保留一位数字作为参考数字,或称为安全数字。 ( 1) 在近似数加减运算时,各运算数据以小数位数为准,其余各数据可多取一位小数,但最后结果应与小数位数最少的数据小数位数的相同。 ( 2) 在近似数乘除运算时,各运算 数据以有效位数最少的数据位数为准,其余各数据要比有效位数最少的数据位数多取一位数字,而最后结果应与有效位数最少的数据位数相同。 5 ( 3) 在近似数平方或平方运算时,平方相当于乘法运算,平方是平方的逆运算,故可按乘除运算处理。 ( 4) 在对数运算时, 为有效数字的数据应该用 位对数表,或用 为对数表,以免损失精度。 ( 5) 三角函数运算中,所取函数值的位数应随角度误差的减小而增多。 3 黄金分割法的基本思想 在实际工程优化设计中,目前应用最多的一维搜索方法是黄金分割法,又称作 0.618 法。黄金分割法属于区间消去法的范 围。这里,首先介绍黄金分割法的消去思想和迭代格式; 我们知道 F(x)的最优解在 a,b上为凸函数且连续,当然,由后面对方法的分析我们可以看到,有时上述要求过于严格了,这表明这种方法的适应面是相当广泛的。 黄金分割法的基本方法是:由于函数最小值所在的区间满足高 -低 -高的原则,边界是函数值的两个高点,这样在搜索区间 a,b内,只要有两个点即可确定那一部分的区间内不含有函数的最小值。我们在首轮迭代时,在搜索区间 a,b内适当插入两点 x1,x2 并计算其函数值,在以后的迭代时,每轮只计算一个新点,保留上轮计算的 一个点,进行迭代消去一部分区间即可。 为此在首轮时要求插入点 x1,x2 的位置相对于区间 a,b两端点具有对称性,即: )( a-bbx 1 )( abax 2 (4-1) 式中, 为待定常数。同时,在下轮迭代时,保留上面的一个点,只计算一个新点即可完成迭代 . 为了求出 ,我们进一步分析迭代过程,从图可以看出,除要求点对称外,黄金分 割法还要求下来的区间内再插入一点所形成的新三段与原来区间的三段具有相同的比例分布。设原区间 a,b的长度为 1,在第一轮搜索时,设有F(x1)F(x2)的情况 ),则保留下来的区间为 a,x2,其长度为,区间缩短率为 1-。在下一轮的迭代中,上一轮保留下的点 x1 成为新点 x2,重新计算点 x1,为了保持相同的比例分布,新插入点 x1应在 (1-)位置上, x在原区间的 1- 位置,故有 ( 4-2) 即 012 ( 4-3) 取方程的正根,有 ( 4-4) 116 1 8.02125 6 若保留下来的区间为 ,根据插入点的对称性,也能推出同样的 值。在工程中,0.618 是一个经常被使用的数,所以,这种寻优 方法, 叫做 “黄金分割法 ”,是指将一线段分成两段的方法,使整段长与较长段与较短段长度的比值,即 )1(:1 使用黄金分割法,相邻两次搜索的区间缩短率为 0.618,所以,黄金分割法又被称作 0.618 法。 黄金分割法的迭代过程和程序框图 如下 : 按照上述分析,黄金分割法的搜索过程是: ( 1) 给出初始搜索区间 a,b 及收敛精度 ,将 赋值 0.618。 ( 2) 按坐标点计算公式( 4-1)计算 x1 和 x2 ,并计算其对应的函数指 F(x1)和 F( x2) 。 ( 3) 比 较 F( x1) 和 F( x2) 的大小,缩小搜索区间,进行区间名称的代换。 ( 4) 检查区间是否缩短到足够小或函数值收敛到足够接近,如果条件满足,则到步骤 ( 5) ,否则,到步骤 ( 6)。 ( 5) 在保留区间中计算一个新的试验点及其相应的函数值,转到步骤 ( 3) . ( 6) 取最后两试验点的平均值作为极小值的数值近似值,并计算该点的函数值作为目标函数的最优解。黄金分割法的程序框图如图 4-1 所示。 4 误差的分析 4.1 算法对精度的影响 在黄金分割法 c 语言的程序中,有多种算法,下面我们只介绍两种算法。并且通过这两种算法,比较其对 结算结果的影响。 ( 1) 第一种算法 #define N 0.618 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); 7 图 4-1 x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+(b-a)*(1-N); printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+(b-a)*N; printf(The qujian is %f,%f.n,a,b); 输入 a,b,c X1=a+0.382(b-a)F(x2) X2=a+0.618(b-a)F(x2) F(x1)F(x2) b=x2 x2=x1,F2=F1 x1=a+0.382(b-a),F1=F(x1) a=x1 x1=x2,F1=F2 x2=a+0.618(b-a),F2=F(x2) |a-b| ? X*=0.5(a+b) F*=F(x*) 结 束 N Y N Y 8 c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 结果 : 区间 1, 4 精度 0.01 N=0.618 第一次 x1 2.145880 第一次 x2 2.854120 区间 2.145880, 4.00000 答案 3.072940 区间 2.145880, 3.291760 答案 2.718820 区间 2.583520, 3.291760 答案 2.937640 最后答案 2.937640 ( 2) 第二 种算法 #define N 0.618 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; 9 printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 结果: 区间 1, 4 精度 0.01 N=0.618 第一次 x1 2.145880 第一次 x2 2.854120 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000,3.292000 答案 2.938000 10 最后答案 2.938000 ( 3) 总结 从这两种算法可以看出来,第一种算法得到的 x 数值精度较低,第二种得到的数值精度较高。这是因为第二种算法中应用了公式关系是: x1=a+b-x2;x2=a+b-x2。而第一种算法应用了公式: x1=a+(b-a)*(1-N); x2=a+(b-a)*N。相比较而言,第二种关系式用 的是加法关系,而第一种算法用的是乘法关系,相乘的关系降低了数值的精度。因此,在计算中应尽量使用加法关系,少用或不用乘法及其它的关系。 4.2 e 对精度的影响 本节主要介绍精度 e 对计算结果的影响 ,其主程序为第 4.3 节的第二种算法。在这次的研究中需要改变输入精度 e 的值。在本节中我们总共进行了 7 轮。如下所诉。 ( 1) 第一轮 区间 1, 4 精度 0.1 N=0.618 第一次 x1 2.146000 第一次 x2 2.85400 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 2) 第二轮 区间 1, 4 精度 1 N=0.618 第一次 x1 0.865200 第一次 x2 0.534800 区间 1.400000, 0.534800 答案 0.967400 最后答案 0.967400 ( 3) 第三轮 区间 1, 4 精度 0.01 N=0.618 11 第一次 x1 2.146000 第一次 x2 2.85400 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 4) 第四轮 区间 1, 4 精度 0.001 N=0.618 第一次 x1 2.146000 第一次 x2 2.854000 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 5) 第五轮 区间 1, 4 精度 0.0001 N=0.618 第一次 x1 2.146000 第一次 x2 2.854000 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 6) 第六轮 区间 1, 4 精度 0.00001 N=0.618 第一次 x1 2.146000 第一次 x2 2.854000 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000, 3.292000 答案 2.938000 12 最后答案 2.938000 ( 7) 第 七轮 区间 1, 4 精度 0.000001 N=0.618 第一次 x1 2.146000 第一次 x2 2.854000 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 8) 总结( e 对 x 精度的影响列表如下:) 次数 第一次 第二次 第三次 第四次 第五次 第六次 第七次 e 0.1 1 0.01 0.001 0.0001 0.00001 0.000001 x 2.938000 0.967400 2.938000 2.938000 2.938000 2.938000 2.938000 e 的精度对计算结果有很大的影响。当 e=1 时, x=0.967400 结果与精确值 x=3有很大的出入,相差很大。但随着 e 的精度的提高, e 的精度得到 0.1 或更高的时候, x 的值的精度不会再提高了。因此对于 e 来说,不是精度越高越好,太高的精度会增加计算量,但对结果精度的提高没有影响或影响甚微。所以,计算时应根据实际情况去选择,而并非一味的去提高精度。 4.3 区间变 化产生的原因 黄金分割法的计算过程也会对结算的结果造成一定程度的影响。在本节中我们主要研究计算时,计算过程中区间的变化及产生这种现象的原因。如程序如下: #define N 0.61 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); 13 x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 结果: 区间 1, 4 精度 0.01 N=0.618 第一次 x1 2.145880 第一次 x2 2.854120 14 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000,3.292000 答案 2.938000 最后答案 2.938000 总结 从以上结果可以看出区间并不是逐渐的减小,而是先减小,而后又增大了。这是因为在算法中当 x1 赋值给上一轮计算的 x2 时, x1 的数值可能要比 x2 大的多;或着 x2 赋值给上一轮计算的 x1 时, x2 的数值可能要比 x1 大的多。 4.4 N( 0.618) 对精度的影响 在程序的计算中 N 的有效位数也会对计算的结果产生影响。本节主要介绍 N的值对计算结果的影响。以下是 N 取不同值时的主程序及计算结果。 ( 1) 第一轮 #define N 0.62 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+(b-a)*(1-N); printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); 15 elsea=x1; x1=x2; x2=a+(b-a)*N; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 结果: 区间 1, 4 精度 0.01 N=0.62 第一次 x1 2.140000 第一次 x2 2.860000 最后答案 2.500000 ( 2) 第二轮 #define N 0.618 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); 16 x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 结果 : 区间 1, 4 精度 0.01 N=0.618 第一次 x1 2.145880 第一次 x2 2.854120 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 17 区间 2.584000,3.292000 答案 2.938000 最后答案 2.938000 ( 3) 第三轮 #define N 0.61804 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); 18 float f(float x) float t; t=x*x-6*x+2; return(t); 结果: 区间 1, 4 精度 0.01 N=0.61804 第一次 x1 2.145880 第一次 x2 2.854120 区间 2.145880, 4.00000 答案 3.072940 区间 2.145880, 3.291760 答案 2.718820 区间 2.583520, 3.291760 答案 2.937640 最后答案 2.937640 ( 4) 第四轮 #define N 0.6180 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; 19 x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 结果: 区间 1, 4 精度 0.01 N=0.6180 第一次 x1 2.146000 第一次 x2 2.854000 区间 2.146000, 4.000000 答案 3.073000 区间 2.146000,3.292000 答案 2.719000 区间 2.584000,3.292000 答案 2.938000 最后答案 2.938000 ( 5) 第五轮 #define N 0.618034 #include void main() 20 float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 21 结果: 区间 1, 4 精度 0.01 N=0.618034 第一次 x1 2.145898 第一次 x2 2.854102 区间 2.145898, 4.000000 答案 3.072949 区间 2.145898, 3.291796 答案 2.718847 区间 2.583592, 3.291796 答案 2.937694 最后答案 2.937694 ( 6) 第六轮 #define N 0.61803399 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; 22 x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 结果: 区间 1, 4 精度 0.01 N=0.61803399 第一次 x1 2.145898 第一次 x2 2.854102 区间 2.145898, 4.000000 答案 3.072949 区间 2.145898, 3.291796 答案 2.718847 区间 2.583592, 3.291796 答案 2.937694 最后答案 2.937694 ( 7) 第七轮 #define N 0.61803399 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N);

温馨提示

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

评论

0/150

提交评论