C语言程序设计_中牛顿迭代算法的教学探索
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 结束语
高职程序设计的最终教学目的,不是简单地使学生 掌握某个计算机语言的基本规则,而是切实培养其解决 实际问题的能力和实现算法的编程能力。为此,教师在 实际教学过程中,只有“重算法,更重方法”,才能提高课 堂教学效果,从而提高学生运用知识的能力。
参考文献:
[1]高福成, 等. C 语言程序设计教程[M]. 北京:清华 大学出版社,2005.8,91- 95.
HUANG Xiong- bo (Department of Computer Science, Foshan Professional Technical College, Foshan 528000, China) Abs tra ct: The paper introduces teaching content of Newton iteration algorithm in C language programming, and analysis its teaching difficulties. The paper explains programming principle of Newton iteration algorithm by iteration - formula' s derivation, and gains good teaching effect. Ke y words : C language programming; Newton iteration algorithm; Teaching effect
1 引言
所谓牛顿迭代算法,就是一种不断用变量的旧值来
递推新值的计算过程,它作为“直到型”循环语句的典型
应用而被众多 C 语言教程所介绍。在现有教材的基础
上,结合迭代公式的推导过程来串讲牛顿迭代算法,使
学生对牛顿迭代算法的原理方法、编程思路以及执行效
率等方面有了更深入的理解,从而取得了较为满意的教
学效果。
1148 电脑知识与技术
能由计算机编程来解决,它的选取应根据实际具体的方 程而定,而示范程序则根据二分法选取了 x/2 作为迭代 的初值。
教师结合实例指出,迭代初值的选取对程序的执行 效率有重要影响。如下列程序是用牛顿迭代法来求解数 值 1000 的平方根,迭代初值 x0 选取为 1000/2,程序运行 的结果为:x1=31.622776 (1000 的近似平方根),count=8 (迭代次数);当把源程序中的迭代初值 x0 变更为 sqrt (1000), 重 新 运 行 程 序 , 得 到 如 下 结 果 :x1 =31.622776 (1000 的近似平方根),count=1(迭代次数)。
(x1)≠0,则得: x2=x1- f(x1)/f' (x1) 这样,得到牛顿法的一个迭代序列:
xn+1=xn- f(xn)/f' (xn)
(式 2)
这里求解平方根 的值,写成方程形式有:x2- a=0,
故以 f(x)=x2- a 代入(式 2)得:x1- (x20- a)/(x2- a)' |x=x0 ,整 理后有:x1=(x0+a/x0)/2 (式 3)
3 C 语言中牛顿迭代算法的教学探索
学生对牛顿迭代算法原理没有清晰的理解主要体 现在以下几点:
(1)平方根的迭代公式为什么是 (式 1)
收稿日期:2007- 09- 25 作者简介:黄雄波(1975- ),男,广东南海人,佛山职业技术学院计算机讲师,硕士,主要研究方向:非线性复杂时滞系统的鲁棒镇定 和计算机软件工程。
当被开方数 a 为一变量时 (取变量的符号为 x),式
3 便变为式 1。
图 1 牛顿迭代过程的几何示意图
3.2 教学讨论 3.2.1 教师点题小结,牛顿迭代算法的本质是逐次 线性化,即每次迭代后用精度更高的切线来替代曲线 f (x) [3]。结合示范程序不难发现,每次迭代运算后均用 x1 变量来保存新的切线与 x 轴的交点,若误差较大,则把 新的交点 x1 赋值给 x0 作为下一次迭代的初值进行迭 代。从课堂的互动及课后的交流情况得知,绝大部分学 生在听完迭代公示的推导后,对示范程序中的变量含 义、程序结构有了更为深刻的理解。 3.2.2 教师串讲分析迭代初值的选取问题[5],从图 1 可以看出,初值 x0 的选取若靠近方程的解 x* 时,迭代次 数就会越少,相应的程序计算时间也越短。迭代初值不
[2]李庆扬, 等. 数值计算原理[M]. 北京:清华大学出 版社,2000.9,259- 281.
[3]白峰杉. 数值计算引论[M]. 北京:高等教育出版 社,2004.7,136- 139.
[4]邓易东. 基于牛顿迭代法的高阶代数方程算法设 计[J]. 石河子大学学报(自然科学版), 2006,24(3),374- 378.
1147
计算机教育
本栏目责任编辑:王力
(2)迭代初值 x0 为什么选取“x/2”? (3)迭代收敛条件为什么是“fabs(x1- x0)>1e- 5”? 显然,学生感到困惑的地方已不在 C 语言的语句 中,而是迭代算法的本身。而回答上述问题,则需要从迭 代公式的推导入手。 3.1 平方根迭代公式的推导过程[2][4] 牛顿迭代法是把非线性方程 f (x)=0 线性化的一种 近似方法。设 x* 和 x0 分别是非线性方程 f(x)=0 的解和 近似解,把 f(x)在 x0 点附近展开成泰勒级数有:
本栏目责任编辑:王力
计算机教育
高职《C语言程序设计》中牛顿迭代算法的教学探索
黄雄波 (佛山职业技术学院 计算机工程系,广东 佛山 528000)
摘要:介绍了 C 语言中牛顿迭代算法的教学内容,并分析了其教学难点。结合迭代公式的推导过程来串讲牛顿 迭代算法的编程原理,取得了较为满意的教学效果。
关键词:C 语言;牛顿迭代算法;教学效果 中图分类号:G642 文献标识码:A 文章编号:1009- 3044(2007)22- 41147- 02 Te a ching Explora tion of Ne wton Ite ra tion Algorithm in C La ngua ge P rogra mming of Highe r Voca tion Colle ge s
[5]崔国华. 计算方法[M]. 武汉:华中理工大学出版 社,1996.11,136- 143.
取其线性部分,作为非线性方程 f (x)=0 的近似方
程,则有:
f(x0)+f' (x0)(x- x0)=0 设 f' (x0)≠0,则其解为:x1=x0- f(x0)/f' (x0) 如图 1 所示,一般地 f(x1)≠0,且 x1 比 x0 更接近非线 性方程 f(x)=0 的解 x*。为此,再把 f(x)在 x1 附近展开成 泰勒级数,也取其线性部分作 f(x)=0 的近似方程。若 f'
2 C 语言中牛顿迭代算法的教学内容及难点分析
2.1 迭代算法的 C 语言程序示例
文献[1]给出的牛顿迭代算法例题为:“用牛顿迭代
法求 2 ̄100 之间的正数 x 的平方根,其中平方根的迭代
公式为:
,要求迭代精度为 0.00001”;教材的示
范源程序如下:
#include <math.h>
#include <stdio.h>
}while(fabs(x1- x0)>1e- 5); /* 迭代收敛条件 */
printf(“%.0f %f\n”,x,x1) ;/* 打印 x 及其平方根近似
值 /
} } 2.2 教学难点的分析 从计算机语言的角度来说,上述示范程序无论是程 序语句还是程序结构均属简单。程序中,外层的 for 循环 语句控制着每个被求平方根的正数 x,并以 x/2 的初值 进行了第一次迭代;内层的 do- while 循环语句控制着迭 代的精度,并根据最近两次迭代结果的误差 |x1- x0| 来确 定迭代是否结束。这里的迭代,就是从初始值 x0 出发,用 平方根迭代公式计算 x1,当 |x1- x0|<0.00001 时,迭代收 敛,x1 就是所求的近似根;否则,用 x1 替换 x0,继续使用 迭代公式进行迭代。 然而,在实际的教学过程中,众多学生普遍反映牛 顿迭代算法的编程思路难以理解和掌握,相应的教学效 果也不尽人意。经过认真的思考和总结,作者发现产生 教学难点的主要原因并不在于 C 语言的语句描述上,而 是在于学生对算法本身没有清晰的理解。由于文献[1]是 一本 C 语言程序设计的教程,所以它只关注如何用 C 语 言来描述迭代算法,至于程序中的平方根迭代公式就没 有具体讲解。为此,在讲授迭代算法的编程思路之前,引 入了相关的数值分析知识来剖析牛顿迭代算法的原理, 这种做法不仅有效地降低了教学内容的难度,而且也使 学生的学习兴趣和信心得到了一定的提高。
main()
{ float x,x0,x1;
for(x=2;x<=100;x++) /* 外层循环确定被求平方根
的数值范围 */
{ x0=x/2; /* 迭代初值 */
x1=(x0+x/x0)/2; /* 迭代公式 */
do /* 内层循环求每个 x 的平方根近似值 */
{ x0=x1;
x1=(x0+x/x0)/2;
#include <math.h> #include <stdio.h> main() {float x0,x1; int count=0; /* 记录迭代次数的变量 */ x0=1000/2; /* 迭代初值 */ x1=(x0+1000/x0)/2; count=count+1; while(fabs(x1- x0)>1e- 5) {x0=x1; x1=(x0+1000/x0)/2; count=count+1; } printf("x1=%f\n",x1) ; printf("count=%d\n",count); /* 打印迭代次数 */ } 3.2.3 教师指引学生思考迭代收敛条件 fabs (x1- x0)> 1e- 5,从图 1 不难发现,每次迭代所得的 xn 与方程的解 x* 就越接近,即存在|xn- xn-1|<|xn-1- xn-2|的关系,当 |xn- xn-1|< 0.00001 时,|x*- xn|<0.00001 也一定成立;至于收敛条件 引入 fabs 绝对值函数的原因是确保前后两次迭代的差 为正数。
高职程序设计的最终教学目的,不是简单地使学生 掌握某个计算机语言的基本规则,而是切实培养其解决 实际问题的能力和实现算法的编程能力。为此,教师在 实际教学过程中,只有“重算法,更重方法”,才能提高课 堂教学效果,从而提高学生运用知识的能力。
参考文献:
[1]高福成, 等. C 语言程序设计教程[M]. 北京:清华 大学出版社,2005.8,91- 95.
HUANG Xiong- bo (Department of Computer Science, Foshan Professional Technical College, Foshan 528000, China) Abs tra ct: The paper introduces teaching content of Newton iteration algorithm in C language programming, and analysis its teaching difficulties. The paper explains programming principle of Newton iteration algorithm by iteration - formula' s derivation, and gains good teaching effect. Ke y words : C language programming; Newton iteration algorithm; Teaching effect
1 引言
所谓牛顿迭代算法,就是一种不断用变量的旧值来
递推新值的计算过程,它作为“直到型”循环语句的典型
应用而被众多 C 语言教程所介绍。在现有教材的基础
上,结合迭代公式的推导过程来串讲牛顿迭代算法,使
学生对牛顿迭代算法的原理方法、编程思路以及执行效
率等方面有了更深入的理解,从而取得了较为满意的教
学效果。
1148 电脑知识与技术
能由计算机编程来解决,它的选取应根据实际具体的方 程而定,而示范程序则根据二分法选取了 x/2 作为迭代 的初值。
教师结合实例指出,迭代初值的选取对程序的执行 效率有重要影响。如下列程序是用牛顿迭代法来求解数 值 1000 的平方根,迭代初值 x0 选取为 1000/2,程序运行 的结果为:x1=31.622776 (1000 的近似平方根),count=8 (迭代次数);当把源程序中的迭代初值 x0 变更为 sqrt (1000), 重 新 运 行 程 序 , 得 到 如 下 结 果 :x1 =31.622776 (1000 的近似平方根),count=1(迭代次数)。
(x1)≠0,则得: x2=x1- f(x1)/f' (x1) 这样,得到牛顿法的一个迭代序列:
xn+1=xn- f(xn)/f' (xn)
(式 2)
这里求解平方根 的值,写成方程形式有:x2- a=0,
故以 f(x)=x2- a 代入(式 2)得:x1- (x20- a)/(x2- a)' |x=x0 ,整 理后有:x1=(x0+a/x0)/2 (式 3)
3 C 语言中牛顿迭代算法的教学探索
学生对牛顿迭代算法原理没有清晰的理解主要体 现在以下几点:
(1)平方根的迭代公式为什么是 (式 1)
收稿日期:2007- 09- 25 作者简介:黄雄波(1975- ),男,广东南海人,佛山职业技术学院计算机讲师,硕士,主要研究方向:非线性复杂时滞系统的鲁棒镇定 和计算机软件工程。
当被开方数 a 为一变量时 (取变量的符号为 x),式
3 便变为式 1。
图 1 牛顿迭代过程的几何示意图
3.2 教学讨论 3.2.1 教师点题小结,牛顿迭代算法的本质是逐次 线性化,即每次迭代后用精度更高的切线来替代曲线 f (x) [3]。结合示范程序不难发现,每次迭代运算后均用 x1 变量来保存新的切线与 x 轴的交点,若误差较大,则把 新的交点 x1 赋值给 x0 作为下一次迭代的初值进行迭 代。从课堂的互动及课后的交流情况得知,绝大部分学 生在听完迭代公示的推导后,对示范程序中的变量含 义、程序结构有了更为深刻的理解。 3.2.2 教师串讲分析迭代初值的选取问题[5],从图 1 可以看出,初值 x0 的选取若靠近方程的解 x* 时,迭代次 数就会越少,相应的程序计算时间也越短。迭代初值不
[2]李庆扬, 等. 数值计算原理[M]. 北京:清华大学出 版社,2000.9,259- 281.
[3]白峰杉. 数值计算引论[M]. 北京:高等教育出版 社,2004.7,136- 139.
[4]邓易东. 基于牛顿迭代法的高阶代数方程算法设 计[J]. 石河子大学学报(自然科学版), 2006,24(3),374- 378.
1147
计算机教育
本栏目责任编辑:王力
(2)迭代初值 x0 为什么选取“x/2”? (3)迭代收敛条件为什么是“fabs(x1- x0)>1e- 5”? 显然,学生感到困惑的地方已不在 C 语言的语句 中,而是迭代算法的本身。而回答上述问题,则需要从迭 代公式的推导入手。 3.1 平方根迭代公式的推导过程[2][4] 牛顿迭代法是把非线性方程 f (x)=0 线性化的一种 近似方法。设 x* 和 x0 分别是非线性方程 f(x)=0 的解和 近似解,把 f(x)在 x0 点附近展开成泰勒级数有:
本栏目责任编辑:王力
计算机教育
高职《C语言程序设计》中牛顿迭代算法的教学探索
黄雄波 (佛山职业技术学院 计算机工程系,广东 佛山 528000)
摘要:介绍了 C 语言中牛顿迭代算法的教学内容,并分析了其教学难点。结合迭代公式的推导过程来串讲牛顿 迭代算法的编程原理,取得了较为满意的教学效果。
关键词:C 语言;牛顿迭代算法;教学效果 中图分类号:G642 文献标识码:A 文章编号:1009- 3044(2007)22- 41147- 02 Te a ching Explora tion of Ne wton Ite ra tion Algorithm in C La ngua ge P rogra mming of Highe r Voca tion Colle ge s
[5]崔国华. 计算方法[M]. 武汉:华中理工大学出版 社,1996.11,136- 143.
取其线性部分,作为非线性方程 f (x)=0 的近似方
程,则有:
f(x0)+f' (x0)(x- x0)=0 设 f' (x0)≠0,则其解为:x1=x0- f(x0)/f' (x0) 如图 1 所示,一般地 f(x1)≠0,且 x1 比 x0 更接近非线 性方程 f(x)=0 的解 x*。为此,再把 f(x)在 x1 附近展开成 泰勒级数,也取其线性部分作 f(x)=0 的近似方程。若 f'
2 C 语言中牛顿迭代算法的教学内容及难点分析
2.1 迭代算法的 C 语言程序示例
文献[1]给出的牛顿迭代算法例题为:“用牛顿迭代
法求 2 ̄100 之间的正数 x 的平方根,其中平方根的迭代
公式为:
,要求迭代精度为 0.00001”;教材的示
范源程序如下:
#include <math.h>
#include <stdio.h>
}while(fabs(x1- x0)>1e- 5); /* 迭代收敛条件 */
printf(“%.0f %f\n”,x,x1) ;/* 打印 x 及其平方根近似
值 /
} } 2.2 教学难点的分析 从计算机语言的角度来说,上述示范程序无论是程 序语句还是程序结构均属简单。程序中,外层的 for 循环 语句控制着每个被求平方根的正数 x,并以 x/2 的初值 进行了第一次迭代;内层的 do- while 循环语句控制着迭 代的精度,并根据最近两次迭代结果的误差 |x1- x0| 来确 定迭代是否结束。这里的迭代,就是从初始值 x0 出发,用 平方根迭代公式计算 x1,当 |x1- x0|<0.00001 时,迭代收 敛,x1 就是所求的近似根;否则,用 x1 替换 x0,继续使用 迭代公式进行迭代。 然而,在实际的教学过程中,众多学生普遍反映牛 顿迭代算法的编程思路难以理解和掌握,相应的教学效 果也不尽人意。经过认真的思考和总结,作者发现产生 教学难点的主要原因并不在于 C 语言的语句描述上,而 是在于学生对算法本身没有清晰的理解。由于文献[1]是 一本 C 语言程序设计的教程,所以它只关注如何用 C 语 言来描述迭代算法,至于程序中的平方根迭代公式就没 有具体讲解。为此,在讲授迭代算法的编程思路之前,引 入了相关的数值分析知识来剖析牛顿迭代算法的原理, 这种做法不仅有效地降低了教学内容的难度,而且也使 学生的学习兴趣和信心得到了一定的提高。
main()
{ float x,x0,x1;
for(x=2;x<=100;x++) /* 外层循环确定被求平方根
的数值范围 */
{ x0=x/2; /* 迭代初值 */
x1=(x0+x/x0)/2; /* 迭代公式 */
do /* 内层循环求每个 x 的平方根近似值 */
{ x0=x1;
x1=(x0+x/x0)/2;
#include <math.h> #include <stdio.h> main() {float x0,x1; int count=0; /* 记录迭代次数的变量 */ x0=1000/2; /* 迭代初值 */ x1=(x0+1000/x0)/2; count=count+1; while(fabs(x1- x0)>1e- 5) {x0=x1; x1=(x0+1000/x0)/2; count=count+1; } printf("x1=%f\n",x1) ; printf("count=%d\n",count); /* 打印迭代次数 */ } 3.2.3 教师指引学生思考迭代收敛条件 fabs (x1- x0)> 1e- 5,从图 1 不难发现,每次迭代所得的 xn 与方程的解 x* 就越接近,即存在|xn- xn-1|<|xn-1- xn-2|的关系,当 |xn- xn-1|< 0.00001 时,|x*- xn|<0.00001 也一定成立;至于收敛条件 引入 fabs 绝对值函数的原因是确保前后两次迭代的差 为正数。