第四章(4.1迭代算法)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1.3 迭代法解方程
• 二分逼近法求解。 二分法求解方程f(x)=0的根。 用二分法求解方程f(x)=0根的前提条件是: f(x)在求解的区间[a,b]上是连续的,且已知 f(a)与f(b)异号,即f(a)*f(b)<0; 【例6】用二分法求一元非线性方程 f(x)=x /2+2x -8=0在区间[0,2]上的近似实根r, 精确到0.0001.
基本的算法策略
4.1 迭代算法
• 定义:迭代法也称“辗转法”,是一种不 断用变量的旧值递推出新值的解决问题的 方法。 • 迭代策略
– 确定迭代模型 – 建立迭代关系式 – 对迭代过程进行控制
4.1.1 递推法
• 递推公式 Sn=Sn-1+An 【例1】 一对兔子从出生后第三个月开始, 每月生一对小兔子。小兔子到第三个月有 开始生下一代小兔子。假若兔子只生不死, 一月份抱来一对刚出生的小兔子,问1年中 每个月各有多少只兔子。
4.1.1 递推法
• 数学模型 y1=y2=1, yn=yn-1+yn-2 ,n=3,4,5… main() { int i,a=1,b=1; printf(“%d%d”,a,b); for(i=1;i<=10;i++) { c=a+b; printf(“%d”,c); a=b; b=c; } }
4.1.3 迭代法解方程
• 牛顿迭代法 迭代公式:
xn+1=xn-f(xn)/f’(xn)
【例5】 求形如ax +bx +cx+d=0,在1附近的一个方 程根的算法;
3 2
4.1.3 迭代法解方程
main() { float a,b,c,d,fx; scanf(“%f%f%f%f”,&a,&b,&c,&d); fx=f(a,b,c,d); printf(“方程的根为 方程的根为%f”,fx); 方程的根为 } float f(float a,float b,float c,float d) { float x1=1,x0,f0,f1; do { x0=x1; f0=((a*x0+b)*x0+c)*x0+d; f1=(3*a*x0+2*b)*x0+c; x1=x0-f0/f1; } while(fabs(x1-x0)>=1e-4); return x1; }
4.பைடு நூலகம்蛮力法
main() { int a[10000]; scanf(“%d”,&n); for(i=1;i<=n;i++) a[i]=1; for(i=1;i<=n;i++) for(j=i;j<=n;j+i) a[j]=1-a[j]; for(i=1;i<=n;i++) if(a[i]==0) printf(“%d is free”,i); }
3 2
4.1.3 迭代法解方程
main() { float x,x1=0,x2=2,f1,f2,f; scanf(“%f%f”,&x1,&x2); f1=x1*x1*x1/2+2*x1*x1-8; f2=x2*x2*x2/2+2*x2*x2-8; If(f1*f2>0) {printf(“non root”);} d0 { x=(x1+x2)/2; f=x*x*x/2+2*x*x-8; if(f==0) break; if(f1*f>0.0) {x1=x;f1=f;} else x2=x; } while(fabs(f)>=1e-4); printf(“root is%f”,x); }
4.2蛮力法
蛮力法是基于计算机运算速度快这一特征, 在解决问题时采取的一种“懒惰”的策略。 这种策略不经过思考,把问题的所有情况 或所有过程交给计算机去一一尝试,从中 找出问题的解。 • 枚举法
– 找出枚举范围 – 找出约束条件
4.2蛮力法
【例7】百钱百鸡问题。 【例8】 ABCAB * A
________________
【例3】 输出杨辉三角形(限定用1个一维数组完成) 1 11 121 1331 14641
4.1.2 倒推法
main() { int n,I,j,a[100]; scanf(“%d”,&n); a[1]=a[2]=1; printf(“%d%d”,a[1],a[2]); for(i=3;i<=n;i++) { a[1]=a[i]=1; for(j=i-1;j>1;j--) a[j]=a[j]+a[j-1]; for(j=1;j<=I;j++) printf(“%d”,a[j]); printf(“\n”); } }
4.1.2 倒推法
• • • • • • • • • • • • • int f(int n) { if(n==10) return 1; else return 2*(f(n+1)+1); } main() { int s; s=f(1); printf("%d",s); }
4.1.2 倒推法
DDDDDD
4.2蛮力法
【例9】狱吏问题。 某国王对囚犯进行大赦,让一个狱吏n次通过一排 锁着的n间牢房,每通过一次,按所定规则转动n 间牢房中的某些门锁,每转动一次,原来锁着的 被打开,原来打开的被锁上,通过n次后,门锁开 n 着的,牢房中的犯人放出,否则犯人不得获释。 转动门锁的规则是这样的,第一次通过牢房,从 第一间开始要转动每一把门锁,即把全部锁打开; 第2次通过牢房时,从第二间开始转动,每隔一间 转动一次;……;第k次通过牢房,从第k间开始 转动,每隔k-1间转动一次;问通过n次后,哪些 牢房的锁仍然是打开的。
4.1.3 迭代法解方程
• 迭代法解方程的实质是按照下列步骤构造 一个序列x0,x1,x2,…xn,来逐步逼近方程 f(x)=0的解。
– 选取适当的初值x0; x0; – 确定迭代格式,即建立迭代关系,需要将方程 f(x)=0改写为x=∮(x)的等价形式; – 构造序列x0,x1,x2,…xn,即先求得x1=∮(x0), 再求x2=∮(x1)…如此反复迭代,就得到一个数 列x0,x1,…xn,若这个数列收敛,即存在极值, 这个极值x*就是方程f(x)=0 的根。
4.1.2 倒推法
• 所谓倒推法是对某种特殊问题所采用的违 反通常习惯的,从后往前推解问题的方法。 【例2】 一只猴子摘了若干桃子,每天吃现有桃子 的一半多一个,到第10天时就只有一个桃 子了,求原来有多少个桃。
4.1.2 倒推法
• • • • • • • • • • 数学模型:a10=1,a9=(1+a10)*2… 递推公式:ai=(1+ai+1)*2 main() { int i,a; a=1; for(i=9;i>=1;i=i-1) a=(a+1)*2; printf(“%d”,a); }
4.1.2 倒推法
【例4】穿越沙漠问题 一辆吉普车穿越1000千米的沙漠,吉普车的 总装载量为500加仑,耗油率为1加仑/千米。 由于沙漠中没有油库,必须先用这辆车在 沙漠中建立临时油库,若吉普车用最少的 耗油量穿越沙漠,应在那些地方建立油库, 以及各处存储的油量。
4.1.2 倒推法
main() { int dis,k,oil,k; dis=500,k=1;oil=500; do { printf(“%d%d%d”,k,1000-dis,oil); k=k+1; dis=dis+500/(2*k-1); oil=500*k; } while(dis<1000); oil=500*k+(1000-dis)*(2*k-1); printf(“%d%d%d”,k,0,oil); }