Java使用牛顿迭代法求一个数的算术平方根
2018-02-07 22:04
176 查看
牛顿迭代法:
随便找一个曲线上的A点,做一个切线,切线的根与曲线的根还有一定的距离。从这个切线的根出发,做一根垂线,和曲线相交于B点,继续重复刚才的工作,经过多次迭代会越来越接近 曲线的根,迭代收敛.
方程f(x)-M=0;
二次方程,首先不考虑震荡/多根/远离等情况
首先随意给一个值 x0,得到过该点的切线方程
f'(x0)(x-x0)+f(x0)=0;
求得该切线的跟
x1=x0-f(x0)/f'(x0);
从图像上看x1比x0更接近原始方程的解.
再求点(x1,f(x1))的切线方程;
f'(x1)(x-x1)+f(x1)=0;
根为:x2=x1-f(x1)/f'(x1);
x2比x1更接近方程的解
...
所以若干次重复后,xn就是非常接近二次方程的解.
其中f'(x)=2x;x0为随便的一个数字;f(x)=x^2-m
用java傻瓜方式写出来如下:
public static void main(String[] args) {
System.out.println(sqrt(2));//1.414213562373095
}
public static double sqrt(double m) {
double x=5201314;//随便给一个数
for(int i=0;i<30;i++) {//迭代50次,求过切线的根x的切线的根...
x=(x*x+m)/2/x;
}
return x;
}便于理解把这个方程拆成以下几个
public static double sqrt3(double c) {
if(c<0) return Double.NaN;
double err=1e-15;//定义一个很小的误差
double t=c;
while(Math.abs(t-c/t)>err*t) {//实际上为t^2-c>err,表示最终结果和真实的平方根相差不超过1的负15次方
t=(c/t+t)/2.0;
}
return t;
}
参考:http://www.matongxue.com/madocs/205.html#/madoc
随便找一个曲线上的A点,做一个切线,切线的根与曲线的根还有一定的距离。从这个切线的根出发,做一根垂线,和曲线相交于B点,继续重复刚才的工作,经过多次迭代会越来越接近 曲线的根,迭代收敛.
方程f(x)-M=0;
二次方程,首先不考虑震荡/多根/远离等情况
首先随意给一个值 x0,得到过该点的切线方程
f'(x0)(x-x0)+f(x0)=0;
求得该切线的跟
x1=x0-f(x0)/f'(x0);
从图像上看x1比x0更接近原始方程的解.
再求点(x1,f(x1))的切线方程;
f'(x1)(x-x1)+f(x1)=0;
根为:x2=x1-f(x1)/f'(x1);
x2比x1更接近方程的解
...
所以若干次重复后,xn就是非常接近二次方程的解.
其中f'(x)=2x;x0为随便的一个数字;f(x)=x^2-m
用java傻瓜方式写出来如下:
public static void main(String[] args) {
System.out.println(sqrt(2));//1.414213562373095
}
public static double sqrt(double m) {
double x=5201314;//随便给一个数
for(int i=0;i<30;i++) {//迭代50次,求过切线的根x的切线的根...
x=(x*x+m)/2/x;
}
return x;
}便于理解把这个方程拆成以下几个
public static double sqrt2(double m) { double x0=1.0;//随便给一个值 for(int i=0;i<20;i++) {//重复20次 x0= myGetX(x0,m); } return x0; } public static double myGetY(double x,double m) { return x*x-m; } public static double myGetX(double x,double m) { return x-myGetY(x,m)/2/x; }最终版
public static double sqrt3(double c) {
if(c<0) return Double.NaN;
double err=1e-15;//定义一个很小的误差
double t=c;
while(Math.abs(t-c/t)>err*t) {//实际上为t^2-c>err,表示最终结果和真实的平方根相差不超过1的负15次方
t=(c/t+t)/2.0;
}
return t;
}
参考:http://www.matongxue.com/madocs/205.html#/madoc
相关文章推荐
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 在启动脚本中一般使用类似如下的命令执行一个Java程序
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 一个使用多线程删除指定目录及子目录下所有指定文件的Java程序(源码)
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 用java自制了一个图片大小转换器,欢迎使用
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- Java中使用Graphics 画图的一个问题
- 使用javascript模拟了一个类似Java的HashMap类
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- java中使用向量做的一个简单翻页程序
- 一个使用Java读取串口的程序
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 使用JSP + JAVABEAN + XML 开发的一个例子
- [Source Code]Java I/O --- ---使用dom读取一个xml文件的叶子节点的text content