迭代算法

利用迭代算法解决问题,需要做好以下三个方面的工作:
  一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
  二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方

法来完成。
  三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。


示例1:斐波那契数列的非递归实现:
斐波那契数列是从第0项和第1项开始,之后的项等于其前面相邻两项之和。
F(n)=F(n-1)+F(n-2),F(0)=0,F(1)=1。

int Fibs(int n) {   
if(n < 0) {
throw new IllegalArgumentException(" the parameter is valid!");
}
int n1 = 0;//F(n-2),迭代变量
int n2 = 1;//F(n-1),迭代变量
int r = n1;//F(n)
if(n == 1) {
r = n2;
}
for (int i = 2; i <= n; i++) { //用循环控制迭代过程
//迭代关系式
r = n1 + n2 ;//F(n)=F(n-1)+F(n-2)
n1 = n2;
n2 = r;
}
return r;
}


示例2:牛顿迭代法求平方根(Newton's Method)。

/**
* 求平方根
* @param d 待开方数
* @param precision 算术平方根的精度
* @return
*/
double sqrt(double d,double precision) {
double x1 = d/2, x2 =(x1 + d/x1)/2;
while(Math.abs(x2 -x1)>precision) {
x1 = x2;
x2 =(x1 + d/x1)/2;
}
return x1;
}

示例3:辗转相除法求最大公约数
long gcd(long x,long y) {
if(x < y) {
long m = x;
x = y;//x存储较大的一个数
y = m;
}
long k = 0;
while(y != 0) {
k = x%y;
x = y;
y = k;
}
return x;
}


示例4:迭代法解方程
  迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:
  (1) 选一个方程的近似根,赋给变量x0;
  (2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;
  (3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
  若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。

【算法】迭代法求方程的根
{  
x0=初始近似根;
do {
x1=x0;
x0=g(x1); /*按特定的方程计算新的近似根*/
} while ( Math.abs(x0-x1)>精度);
System.out.printf(“方程的近似根是%f\n”,x0);
}
例1:解方程:x*x*x-x-1=0

public class Test2{

public static double f(double x){
double y;
y=x*x*x-x-1; //计算
return(y);
}
public static void main(String args[]){
double x0=1.5,x1=1.5;
do{
x1=x0;
x0=Math.pow((1+x1),1/3.0);
}while(Math.abs(x0-x1)>1e-7);
System.out.println(f(x0));
System.out.printf("方程的近似根是%f\n",x0);
}
}


示例5:使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根
f(x)=f(x0)+f'(x0)*(x-x0)+…
若上面方程有根x,使得f(x)=0,取前两项得x=x0-f(x0)/f'(x0)
迭代关系式:
[img]http://dl.iteye.com/upload/attachment/0072/0115/20b5e894-c0ed-3dec-80c0-deeddc29370e.gif[/img]
例:求方程f(x) = cos(x)-x^3的根.
f'(x) =-sin(x)-3x^2
方程的根位于0和1之间,x0=0.5
import static java.lang.Math.*;
public class Test1{

public static double f(double x){
double y;
y=x-(cos(x)-pow(x,3))/(-sin(x)-3*pow(x,2)); //计算
return(y);
}
public static void main(String args[]){
double x0=0.5;
double x1=x0;
do{
x1=x0;
x0=f(x1);
}while(Math.abs(x0-x1)>1e-7);

System.out.printf("方程的近似根是%f\n",x0);
System.out.printf("cos(x)-x^3="+(cos(x0)-pow(x0,3)));
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值