0x01 牛顿迭代法和二分法求根属于编程中常见问题,下面让我们详细来说一下这个问题,先介绍牛顿迭代法,其次二分
0x02 牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数的泰勒级数的前面几项来寻找方程的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。
0x03直接给出公式x=x0-f(x0)/f’(x0),设迭代到|x-x0|<=1e-5例子:2x^3-4*x+3x-6=0
#include <stdio.h>
#include<math.h>>
int main(){
float x = 1.5,x0,h,f,fd;
do{
x0 = x;
f = 2*x*x*x-4*x*x+3*x-6;
fd = 6*x*x-8*x+3;
h = f/fd;
x = x-h;
}while(fabs(x-x0)>=1e-5);
return x;
}
0x04简单说一下:f就是式子,fd为f’(x),然后套用公式就好了最后判断是否在范围内,在内则输出
我这个是指定方程的,下面给大家一个博主写的,这个博主的接收键盘参数,我没写那么多
https://blog.youkuaiyun.com/janmesyang/article/details/83187465
0x05 二分法是指对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法,当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。
例题:方程在(-10,10)之间的根:2x^3-4x ^2+3x-6=0
#include<stdio.h>
#include<math.h>
int main()
{
double f_x(double x);
int i=1;//记录循环次数
double x1=-10.0,x2=10.0;//左右端点
double x;//区间中点
do
{
x=(x1+x2)/2;//每次取中点
if(f_x(x)==0) break;
else
{
if(f_x(x1)*f_x(x)>0) x1=x;//这里由于曲线f(x)单调递增
else x2=x; //递增或者递减来换端点
}
i++;
}while(fabs(x1-x2)>1e-6); //控制循环终止条件
printf("\n方程的解:x=%9.6f\t共迭代:%d次\n",x,i-1);
return 0;
}
double f_x(double x)
{
return(2*x*x*x-4*x*x+3*x-6);
}
详情可以看一下这个博主的
https://blog.youkuaiyun.com/wtdm_160604/article/details/70873559
前几天才知道excel这些强大功能,所以简易做了一个,如果有错误,麻烦师傅们指出,这些是我自己理解
。如果有需要java的记得评论一下