迭代法的学习

迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为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); 
}

public class Test1{

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

C:\java>java Test1
-2.0056621405029063E-5
方程的近似根是1.839283

例2:解方程: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);
   }
}

C:\java>java Test2
4.4345108918264486E-8
方程的近似根是1.324718

例3:
用迭代法求某数a的平方根。已知求平方根的迭代公式为:x [n+1] = (x[n] + a / x[n]) / 2
要求前后两次求出的差的绝对值小于10-5。

算法如下:

① 设定一个x的初值x0 ; (在如下程序中取x0=a/2, 通过迭代公式求出x1,可以肯定与真正的平方根相比,误差很大。)
② 用上述公式求出x的下一个值 x1 ;
③ 如此继续下去,直到前后两次求出的x值(x n+1和xn)满足以下关系:|x n+1-xn|<10-5 .

public class Test{
  public staic void main(String args[]){

double a; /* 被开方数 */
   double x0, x1; /* 分别代表前一项和后一项 */
   a=Double.parseDouble();
   x0 = a / 2; /* 任取初值 */
   x1 = (x0 + a / x0) / 2;
   while (Math.abs(x1 - x0) >= 1e-5)
    {
    x0 = x1;
    x1 = (x0 + a / x0) / 2;
   }
      System.out.printf("The square root of %5.2f is %8.5f\n", a, x1);
   }
}

运行结果:

C:\java>java Test 3
The square root of 3.00 is 1.73205

C:\java>java Test 100
The square root of 100.00 is 10.00000

C:\java>java Test 2
The square root of 2.00 is 1.41421

时间: 2024-10-20 15:02:47

迭代法的学习的相关文章

sqrt (x) 牛顿迭代法

参考: 0开方 是 0 1的开方式 1 2的开方式 1.4 3.的开方=(1.4+3/1.4)/2 牛顿迭代法:学习自 http://blog.csdn.net/youwuwei2012/article/details/34075241 public class Solution { public int sqrt(int x) { if(x==0)return 0; double pre=0; double cur=1; while(Math.abs(cur-pre)>0.000001) {

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个

学习笔记(信号与系统)

学习笔记(信号与系统) 来源:网络 第一章 信号和系统 信号的概念.描述和分类 信号的基本运算 典型信号 系统的概念和分类 1.常常把来自外界的各种报道统称为消息: 信息是消息中有意义的内容: 信号是反映信息的各种物理量,是系统直接进行加工.变换以实现通信的对象. 信号是信息的表现形式,信息是信号的具体内容:信号是信息的载体,通过信号传递信息. 2.系统(system):是指若干相互关联的事物组合而成具有特定功能的整体. 3.信号的描述--数学描述,波形描述. 信号的分类: 1)确定信号(规则信

算法学习笔记

对于一个软件人员来说,算法和数据结构是无法逃避的,越是逃避说明越是需要继续学习和巩固.加深.转载一篇github上有关算法的文章,以便于进行继续学习和理解.当然并不是说非得全部掌握所有算法至少达到需要的时候会找,找到了会使,使完了能明白是什么东西才能更好的进行coding.这篇文章是有关C的 下次再弄个Java语言的算法部分.学无止境嘛,不能光看java也要学习学习C 学习方法 把所有经典算法写一遍 看算法有关源码 加入算法学习社区,相互鼓励学习 看经典书籍 刷题 原文地址:https://gi

多项式求ln,求exp,开方,快速幂 学习总结

按理说Po姐姐三月份来讲课的时候我就应该学了 但是当时觉得比较难加上自己比较懒,所以就QAQ了 现在不得不重新弄一遍了 首先说多项式求ln 设G(x)=lnF(x) 我们两边求导可以得到G'(x)=F‘(x)/F(x) 则G(x)就是F’(x)/F(x)的积分 我们知道多项式求导和积分是O(n)的,多项式求逆是O(nlogn)的 所以总时间复杂度O(nlogn) 多项式求ln一般解决的问题是这样的 设多项式f表示一些奇怪的东西,由一些奇怪的东西有序组成的方案为 f^1+f^2+f^3…… 化简之

排序学习实践

排序学习实践---ranknet方法 http://www.cnblogs.com/LBSer/p/4439542.html 1 背景 随着移动互联网的崛起,越来越多的用户开始习惯于从手机完成吃.喝.玩.乐.衣.食.住.行等各个方面的需求.打开手机,点开手淘.美团等APP,商品玲玲满目,而让用户将所有商品一页页看完已经不现实,通常情况下用户也就查看前几页,如果找不到满意的商品则退出,从而造成流单.因此如何对商品进行排序使得用户能尽快完成购买流程已经成为这些平台的重要攻克方向. 图1 手机淘宝.美

【转载】增强学习(Reinforcement Learning and Control)

增强学习(Reinforcement Learning and Control)  [pdf版本]增强学习.pdf 在之前的讨论中,我们总是给定一个样本x,然后给或者不给label y.之后对样本进行拟合.分类.聚类或者降维等操作.然而对于很多序列决策或者控制问题,很难有这么规则的样本.比如,四足机器人的控制问题,刚开始都不知道应该让其动那条腿,在移动过程中,也不知道怎么让机器人自动找到合适的前进方向. 另外如要设计一个下象棋的AI,每走一步实际上也是一个决策过程,虽然对于简单的棋有A*的启发式

学习了解递归和尾递归的区别

学习了递归和尾递归后,自己做了一些简单的总结,便于学习. 以典型的斐波那契数列为例,比较二者: import java.util.Scanner; public class testFibonacci { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); System.out.println(fibonacci1(n)); System.out.pr

深度学习最全优化方法---来源于知乎

写在前面:本宝宝好想只了解sgd,monument,adagrad,adam深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam) ycszen 1 年前 前言 (标题不能再中二了)本文仅对一些常见的优化方法进行直观介绍和简单的比较,各种优化方法的详细内容及公式只好去认真啃论文了,在此我就不赘述了. SGD 此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochas