1.3算法案例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计算法 根据上述的分析,我们可以写出解决问题的算法如下: ①令H=10; ②令S=0;
③L=0.7×H; ④S=S+H+L; ⑤H=L; ⑥如果L≥10/1000,返回第③ ⑦输出S的值;
⑧结束
例一个关于栽树数量的I.Q.题 小陆学校的3个环保活动小组经常利用节假日去栽树。有一
天,李老师问小陆3个小组各栽了多少树?因为李老师是教
作为递推公式(3.4.2)的初值为: t 0 1 u 0 a 0
(3.4.2)
(3.4.3)
这样,就可以利用初值(3.4.3),对于k=1, 2,…直到n,反复利用公式(3.4.2)进行计算, 最后就可以得到。其算法描述如下:
(1)逐项法多项式求值。 输入:存放 Pn x 的系数数组A(0:n); 自变量x值。其中 n 1 输出: Pn x 值P
原来的一半,我们可以更小的范围找到根。当有根的
区间的长度足够小(通常是小于预先指定的误差),
这时区间内任意两点的距离都小于区间的长度,所以
区间内的任意一点都可以用来当方程根的近似值。这 个就是对半求根法
参考算法: 第一步 确定有解区间 [a, b]
( f (a) f (b) 0)
第二步 取 [a, b] 的中点 (a b)/2
由初等函数f(x)=0构成的方程,如果有f(a)f(b)<0,则
可以肯定方程f(x)=0在(a , b)至少有一个实数根。 选择(a , b)的中点c,若f(c)=0,则根就是x=c。 若f(c)<0或f(c)>0,则用c值取代相应的a或b(取代原则 是:保证有f(a)f(b)<0),这样(a , b)的长度就只有
图 3.17 y=x-3s inx 的 象 用 半 图 及 对 5 ( , )的中点 ,则因 法缩小有根范围示意图: 2 4 8 5 为 f ( ) 0, 所以,方程 根 位 的 置 8 3 5 3 在( , )应当有根。 2 8 4 1 不断重复这个过程,要 么 2 某一次区间的中点就是 根, 0 要么有根的范围缩小了 一 半,当有根的范围小于 题 c a b 目要求的精度0.0001 ,那么 有根范围1: 2 c 3 这个区间中的任意一点 都 有根范围2: a b 2 4 可以当作是方程根的近 似 c 3 5 有 范 3: 根 围 a b 值。 4 8
p A0 A1 x; t x
PROCEDURE CPOLY(A,n,x,P)
t t x; P P Ai t
OUTPUT P RETURN
FOR i=2 TO n DO
在这个算法中,为了计算一个x点处的函数,共需要作2n1次乘法和n次加法。还能不能减少乘法的次数呢?我们 可以将式(3. 4. 1)的右端按降幂次序重新排列,并将它 表述成如下嵌套形式 Pn x an x an1 x an2 x a1 x a0 (3.4.4) 这样,就可以利用式(3.4.4)的特殊结构,从里往外一 层一层地进行计算,即按如下递推关系进行计算: u n an k n 1,,1,0 (3.4.5) u k u k 1x ak
把30723分解为3个大于10的因子的乘积只有5种情况 ①11×19×147(三个因子的和是177) ②11×21×133(三个因子的和是165) ③19×49×57 (三个因子的和是101)
④11×49×57 (三个因子的和是117)
⑤19×21×77 (三个因子的和是117)
在这5种情况中考察,符合a>b+c而且最大的数小于100的,
3
例 闰年问题:输入年份y,判断该年份是否为闰年 并输出结果。
设y为年份,按照历法的规定,如果y为闰年, 那么或者y能被4整除但不能被100整除,或者y能被 400整除。可以用选择结构将上述算法表示如下:
若y不能被4整除,则输出“y不是闰年”;
若y能被4整除,则判断y是否被100整除,则:
小球的运动由多次的下落和弹起构成,但弹起的次 数并不容易知道。小明把小球每次下落和弹起的路 程列出,如表3-1所示,试图寻找一些规律。
下 落 弹 起
第1次 10
第2次 7
第3次 4.9
第4次 3.43
…… …… ……
10×0.7= 7×0.7=4 4.9×0.7=3. 3.43×0.7=2.3 4.9 .9 43 401
PROCEDURE CHORNER(A,n,x,P) P An
FOR i=n-1 TO 0 BY -1 DO P P x Ai OUTPUT P RETURN
由秦九韶算法可以看出,多项式函数的求 值只要用一个很简单的循环就能完成,并 且在这个循环中只需要作n次乘法和n次加 法就够了。它在实际使用中是一个很有效 的方法。
从表中容易看出:小球每次弹起的距离就是本次下落距离的0.7 倍,而每一次下落距离等于上一次弹起的距离,即 Ln=0.7Hn Hn+1=Ln 其中Hn第n次下落的距离,Ln为第n次弹起的距离,n=1,2, 3,…,H1=10。把它们都相加,即可求出问题的解: S=(H1+L1)+(H2+L2)+(H3+L3)+……
M 1. 设 M mi 分别计算M i (i 1, ...,k ) mi i 0 2. 分别解关于M i'的同余方程: i' M i 1(modmi ) M (i 1, ..., k) 3. 令a i M i' M i,则同余方程组的正整 数解是: x ai bi (modM )
问题 a、b、c是三个整数,100 > a > b > c > 10, a×b×c==30723,且a > b+c,试确定a、b、c的值。 分析问题
解决这个问题应当从a×b×c==30723入手。把30723三个整
数相乘的积,只能有有限种情况,我们可以把这些情况一一 罗列出来,然后分析哪一种情况是符合条件的。从而找到答 案。(在列举所有情况时,注意三个因子都大于10,这可以减 少列举的工作量)。
(1)若y不能被100整除,则输出“y是闰年” (2)若y能被100整除,则判断y是否能被400整除,则: ① 若y能被400整除,则输出“y是闰年”;
② 若y不能被400整除,则输出“y不是闰 年”。 这个算法的流程图如下图4-3:
小球运动问题
问题: 小球从10米高处自由下落,每次弹回的高度大约是 下落高度的70%。当小球弹起的高度不足最初高度 的千分之一时,小球很快就会停止跳动。计算小球 在整个弹跳过程中所经历的总路程(忽略高度不足 原高度千分之一的部分)。 分析问题
最后可得结果
Pn x u0
这种多项式求值的方法是由我国宋代的一位 数学家秦九韶最先提出的,我们称之为秦九 韶方法,在有的书上也叫霍纳(Horner)方法。 其算法描述如下: 算法3.2多项式求值的秦九韶方法. 输入:存放 Pn x 的系数数组A(0:n); 自变量x值。其中 n 1。 输出: n x 值P。 P
算法案例
1.多项式求值的秦九韶方法 如果给定一个多项式,
(3. 4.1) 其中 n 1 现在的问题是,给定一个x的值,要求 多项式函数Pn x 的值。对于这个问题,一种看起来 很“自然”的方法是直接逐项求和。如果用 表示 tk u x的k次幂,k 表示式(3. 4.1)右端前k +l项的部分 和,即 x k t
例. 中国剩余定理(孙子定理)若k>2,且m1, m2,…mk是两两互素的k个正整数,令M= m1m2…mk=m1M1=m2M2=…=mkMk。 则同余式组:x1=b1(modm1), x2=b2(modm2),…xk=bk(modmk) 其正整数解是: X≡b1M1’M1+b2M2’M2+…+bkMk’Mk(modM) 其中Mi’是满足同余式: Mi’Mi≡1(mod mi) (i = 1, 2…k) ∴用孙子定理解同余式组: xi=bi(modmi) ( i = 1,2…k )的算法步骤如下:
只有最后一种情况,即a=77,b=21,c=19。
计算算法 设计穷举算法的关键是如何列举所有可能的情况,绝对不能 遗漏,最好不要重复。在列举时注意变量的范围,可以减少 工作量。 我们可以从最小的变量c入手,让它从10开始变化。但变化 的范围到哪里为止呢?粗略估算一下,三个数相乘是30723, 最小的c不超过它的立方根。我们可以用平方根做近似替代, 不必作太多推算。 当c值产生之后,就可以处理变量b。因为它不小于c,让它 从c开始,也让它变化到30723的平方根。 有了c和b的值之后,就要判断他们是否都是30723的因子。 如果是,计算出第三个因子a,然后进行判断:a是否大于 b+c并且a<100。满足条件就是解答了。
例(对半法求方程解): 方程x-3sinx=0 有一个根,试把它求出来,要求准确到 0.0001。
分析问题: 记 f ( x) x 3 sin x。 注意到 f ( ) 3 0, 2 2 及 f ( ) 3 sin 0, 而y x 3 sin x的图线在 ( ,)是没有间断的,所以 我们有理由认为,方 2 程x 3 sin x 0 在( ,)之间应当有一个根。 2 3 同样的,如果我们取( ,)的中点 ,则因 2 4 3 3 为 f ( ) 0, 所以方程在( , )应当有根。取 4 2 4
第三步 计算函数f(x)在中点处的函数值
f(
ab ) 2
。
第四步 判断函数值
f(
ab ) 2
是否为0。 就是方程的解,问题就得 不为0,则分下列两种
x (1) 如果为0, 到了解决。
ab 2
(2) 如果函数值 情形:
f(
ab ) 2
①若 为 ( a, a b ) ;
2
f (a) f (
老师后来告诉小陆,她用的是穷举法。 穷举算法的思路是,列举出所有可能的情况,逐个判断有哪
些是符合问题所要求的条件,从而得到问题的解答。
.Q.题很有意思,但它用对话的形式表达,有些条件不够 明确,因此需要用数学语言来描述它。(用数学语言描述 问题,叫做建立数学模型。在解决实际问题时,一般都需 要为这个问题建立数学模型)。
ab )0 2
,则确定新的有解区间
②若
( ab , b) 2
f (a) f (
ab ) 0 ,则确定新的有解区间为 2
第五步 判断新的有解区间的长度是否小于精确度: (1)如果新的有解区间长度大于精确 度,则在新的有解区间的基础上重复上述步 骤; (2)如果新的有解区间长度小于或等 于精确度,则取新的有解区间的中点为方程 的近似解。 对半求根的过程可以用如下框图表示(图4-1) 用流程图表示如下:
i 1 k
k
2.对半法查找(二分法)算法
对这种算法的实质是在一个有限且有序的对象中,通
过每次缩减一半查找范围而达到迅速确定目的一个有
效算法。因此有着很广泛的应用。例如,在数学中有
很多方程是写不出根的解析表达式的,但是根的存在
范围比较容易确定,那么如何才能找到它的根的一个 足够准确的近似值呢?这时对半查找算法就可以大显 身手了。
k
P x a0 a1x a2 x an x n
2
n
uk a0 a1x a2 x ak x
2
k
由于x的k次幂实际上等于其次幂再乘上x,而 前k+1项的部分和等于前k项的部分和再加上第 k +l项,因此,逐项求和的方法可以归结为如 下的递推关系:
t k xtk 1 k 1,2,, n u k u k 1 a k t k
数学的,小陆就调皮的回答:“3个小组的栽树数量相乘的 积是30723,您能把3个组的栽树数量算出来吗?”李老师 说:“只有这个条件不能确定答案呀。你能补充点情况吗?” 于是小陆补充说:“A组都是大个子同学组成的,栽的树虽
然不到100棵,但比另外两组合பைடு நூலகம்来的还要多。栽树最少的
C组也早就超过了10棵。”这是李老师说,“那我算出来 了。”李老师是怎样算出来的呢?