三次函数求近似解

牛顿迭代法、二分法

本人大一学生,学习C语言刚刚三个月,分享一下自己学习的题目和方法,欢迎大佬们批评指正!
首先解释一下牛顿迭代法和二分法的原理:
(参考同济大学高等数学第七版上册 第三章第八节 方程的近似解)
首先根据切线的定义式,并通过近似逼近:
(f(x)f(x)f(x)-f(x0f(x_0f(x0​))/(x−x0x-x_0x−x0​)=f1(x)f^1(x)f1(x)
令f(x0f(x_0f(x0​)=0
移项得
x=x0−f(x0)/f1(x0)x=x_0-f(x_0)/f^1(x_0)x=x0​−f(x0​)/f1(x0​)
每一次的迭代都会逼近于真实解
(不明白的话可以去翻翻高数课本,各高校的教材应该都会有)
先上文件和函数库

#include<iostream>
#include<cmath>//调用pow函数
#define EPSILON 1e-6//确定精度
using namespace std;

再放原函数和导数的方程

//原函数
double f(int a,int b,int c,int d,double x){return a*pow(x,3)+b*pow(x,2)+c*x+d;
}
//导数
double fDerivable(int a,int b,int c,double x){return 3*a*pow(x,2)+2*b*x+c;
}

再来看牛顿迭代法(循环实现)

//EPSILON为事先规定的精度

double newton(int a,int b,int c,int d,double x){while(fabs(f(a,b,c,d,x)/(fDerivable(a,b,c,x)))>EPSILON){x=x-f(a,b,c,d,x)/fDerivable(a,b,c,x);}return x;
}

再送上牛顿迭代法(递归实现)

double newton2(int a,int b,int c, int d,double x){if(fabs(f(a,b,c,d,x)/(fDerivable(a,b,c,x)))<=EPSILON){return x;}else{x=x-f(a,b,c,d,x)/fDerivable(a,b,c,x);return newton2(a,b,c,d,x);}
}

再来介绍一下二分法(又称为夹逼法)

顾名思义,通过函数的连续性,利用零点定理(介值定理)找到近似解。

先来循环实现

double bi(int a,int b,int c,int d,double x1,double x2){//a,b,c,d为系数 x1 ,x2 为区间左右端点double s1=x1,s2=x2;while(fabs(s1-s2)>1e-6&&f(a,b,c,d,s1)!=0){if(f(a,b,c,d,(s1+s2)/2)*f(a,b,c,d,x1)<0){s2=(s1+s2)/2;//右端点左移 }else{s1=(s1+s2)/2;//左端点右移 }}return s1;
}

再来递归实现

double bi2(int a,int b,int c,int d,double x1,double x2)
{double s1=x1,s2=x2;double m=(s1+s2)/2;//middleif(f(a,b,c,d,m)==0||fabs(s1-m)<EPSILON){//如果正好为解 或 达到指定精度精度 return m;} else if((f(a,b,c,d,m)*f(a,b,c,d,x1))<0){//判断左端点与middle的函数值是否为异号 return bi(a,b,c,d,x1,m);}else{ return bi(a,b,c,d,m,x2);}
}

最后放上全部代码

#include<iostream>
#include<cmath>//调用pow函数
#define EPSILON 1e-6//确定精度
using namespace std;
//原函数
double f(int a,int b,int c,int d,double x){return a*pow(x,3)+b*pow(x,2)+c*x+d;
}
//导数
double fDerivable(int a,int b,int c,double x){return 3*a*pow(x,2)+2*b*x+c;
}
//牛顿迭代法
double newton(int a,int b,int c,int d,double x){while(fabs(f(a,b,c,d,x)/(fDerivable(a,b,c,x)))>EPSILON){x=x-f(a,b,c,d,x)/fDerivable(a,b,c,x);}return x;
}
double newton2(int a,int b,int c, int d,double x){if(fabs(f(a,b,c,d,x)/(fDerivable(a,b,c,x)))<=EPSILON){return x;}else{x=x-f(a,b,c,d,x)/fDerivable(a,b,c,x);return newton2(a,b,c,d,x);}
}
//二分法(循环)
double bi(int a,int b,int c,int d,double x1,double x2){//a,b,c,d为系数 x1 ,x2 为区间左右端点double s1=x1,s2=x2;while(fabs(s1-s2)>1e-6&&f(a,b,c,d,s1)!=0){if(f(a,b,c,d,(s1+s2)/2)*f(a,b,c,d,x1)<0){s2=(s1+s2)/2;//右端点左移 }else{s1=(s1+s2)/2;//左端点右移 }}return s1;
}
//用二分法解(递归)
double bi2(int a,int b,int c,int d,double x1,double x2)
{double s1=x1,s2=x2;double m=(s1+s2)/2;//middleif(f(a,b,c,d,m)==0||fabs(s1-m)<EPSILON){//如果正好为解 或 达到指定精度精度 return m;} else if((f(a,b,c,d,m)*f(a,b,c,d,x1))<0){//判断左端点与middle的函数值是否为异号 return bi(a,b,c,d,x1,m);}else{ return bi(a,b,c,d,m,x2);}
}
int main()
{int a=1,b=-3,c=6,d=-1;//样例函数数据  cout<<"The coefficients are a="<<a<<" b="<<b<<" c="<<c<<" d="<<d<<":"<<endl;double x1=0,x2=1;//(0,1)区间 //牛顿迭代法 cout<<"The approximate root is: "<<newton(a,b,c,d,x1)<<endl;cout<<"The approximate root is: "<<newton2(a,b,c,d,x1)<<endl;//二分法 cout<<"The approximate root is: "<<bi(a,b,c,d,x1,x2)<<endl;cout<<"The approximate root is: "<<bi2(a,b,c,d,x1,x2)<<endl;return 0;
}

总结

1.在实际操作中,牛顿迭代法需要求出f(x)f(x)f(x)的二阶导,画出f(x)f(x)f(x)的大致图像,使指定区间内有且仅有一个零点,判断端点中哪个值为初始的x0x_0x0​。
2.同样的,二分法在实操中,需要确定端点值,使指定区间内有且仅有一个零点。

本人是某邮物联网专业学生,这也是我第一次写博客,再加上是新手,用的不太熟练,欢迎大家批评指正,一起交流学习。

三次函数求近似解(牛顿迭代法/二分法)相关推荐

  1. 数值计算方法 matlab用二分法或简单迭代法求_牛顿法和二分法介绍及其在空气处理当中的应用...

    二分法 如上图所示,对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方 ...

  2. mysql 立方根函数_Java实现牛顿迭代法求解平方根、立方根

    一.简介 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. ...

  3. java对三次函数求导_如何画三次函数图像

    问题 请绘制 的图形 思路一 借助软件 软件名称 介绍 geogebra image.png GeoGebra是自由且跨平台的动态数学软件,提供各级教育使用,包含了几何.代数.表格.图形.统计和微积分 ...

  4. 非线性方程求根——牛顿迭代法

    一.牛顿法 1.实质:牛顿法实质上是一种线性方法,其基本思想是将非线性方程f(x)=0逐步归结为某种线性方程来解. 2.牛顿法公式: 已知方程f(x)=0有近似解xk,假设,将f(x)在点xk泰勒展开 ...

  5. 用c语言编制牛顿法程序,求解试用newton法求函数,YTU 2405: C语言习题 牛顿迭代法求根...

    2405: C语言习题 牛顿迭代法求根 时间限制: 1 Sec  内存限制: 128 MB 提交: 562  解决: 317 题目描述 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b ...

  6. java 牛顿迭代算术平方根,牛顿迭代法求n方根

    一.简单推导 二.使用 借助上述公式,理论上可以求任意次方根,假设要求a(假设非负)的n次方根,则有xn=a,令f(x)=xn-a,则只需求f(x)=0时x的值即可.由上述简单推导知,当f(x)=0时 ...

  7. python迭代法求解方程_第一部分:趣味算法入门;第六题牛顿迭代法求一元三次方程的根...

    100个不同类型的python语言趣味编程题 在求解的过程中培养编程兴趣,拓展编程思维,提高编程能力. 第一部分:趣味算法入门:第六题SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键 ...

  8. Python:牛顿迭代法求平方根

    #69573 牛顿迭代法求平方根[光]-函数复用#69573 牛顿迭代法求平方根描述牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson meth ...

  9. Python趣味算法入门 - 牛顿迭代法求方程根

    问题描述 编写用牛顿迭代法求方程根的函数.方程为,系数a,b,c,d由主函数输入,求x在1附近的一个实根.求出根后,由主函数输出. 牛顿迭代法的公式:,设迭代到  时结束. 分析 在网上可以找到很多关 ...

最新文章

  1. 浅谈Oracle Online redo log
  2. Oracle 11g R2安装过程中遇到的报错及解决办法
  3. 一些简单网络命令用法
  4. 计算机网络_第7版_谢希仁_目录
  5. 灰度图片维度与彩色图片维度-python-scikit-image包
  6. MySQL的insert ignore与replace into不同
  7. MongoDB最简单的入门教程之二 使用nodejs访问MongoDB
  8. Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php )...
  9. 标定精度_【杰瑞课堂】工业机器人运动精度
  10. 初探Object in java
  11. mariadb multi-source replication(mariadb多主复制)
  12. 验证输入是否满足条件
  13. 联创宽带上网助手协议的简单分析(一)start包和off包
  14. 基于动物性去思考人性
  15. 每日内涵微信小程序-2-轮播图圆角
  16. VTK:图形基本操作进阶——连通区域分析
  17. 13个搭讪绝招助你告别单身
  18. mac使用的pd虚拟机window黑屏 ---已解决
  19. 项目经理如何激励自己的团队
  20. java中的匿名内部类总结

热门文章

  1. Eclipse 恢复误删jar包
  2. python转盘抽奖_Python使用Tkinter实现转盘抽奖器的步骤详解
  3. MIPS指令集-mars-cpu
  4. 作用域-函数包围代码
  5. matlab可以做影像组学吗,影像组学分析与建模工具综述.PDF
  6. slam学习(1)——卡尔曼滤波
  7. 二、Apollo高精地图详解(3.Apollo地图采集和生产)
  8. 2022登高架设操作证考试题库及模拟考试
  9. 记SQL Server实战修复死锁总结
  10. vs + BabeLua + Cocos2d-x 3.10配置