三次函数求近似解(牛顿迭代法/二分法)
三次函数求近似解
牛顿迭代法、二分法
本人大一学生,学习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.同样的,二分法在实操中,需要确定端点值,使指定区间内有且仅有一个零点。
本人是某邮物联网专业学生,这也是我第一次写博客,再加上是新手,用的不太熟练,欢迎大家批评指正,一起交流学习。
三次函数求近似解(牛顿迭代法/二分法)相关推荐
- 数值计算方法 matlab用二分法或简单迭代法求_牛顿法和二分法介绍及其在空气处理当中的应用...
二分法 如上图所示,对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方 ...
- mysql 立方根函数_Java实现牛顿迭代法求解平方根、立方根
一.简介 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. ...
- java对三次函数求导_如何画三次函数图像
问题 请绘制 的图形 思路一 借助软件 软件名称 介绍 geogebra image.png GeoGebra是自由且跨平台的动态数学软件,提供各级教育使用,包含了几何.代数.表格.图形.统计和微积分 ...
- 非线性方程求根——牛顿迭代法
一.牛顿法 1.实质:牛顿法实质上是一种线性方法,其基本思想是将非线性方程f(x)=0逐步归结为某种线性方程来解. 2.牛顿法公式: 已知方程f(x)=0有近似解xk,假设,将f(x)在点xk泰勒展开 ...
- 用c语言编制牛顿法程序,求解试用newton法求函数,YTU 2405: C语言习题 牛顿迭代法求根...
2405: C语言习题 牛顿迭代法求根 时间限制: 1 Sec 内存限制: 128 MB 提交: 562 解决: 317 题目描述 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b ...
- java 牛顿迭代算术平方根,牛顿迭代法求n方根
一.简单推导 二.使用 借助上述公式,理论上可以求任意次方根,假设要求a(假设非负)的n次方根,则有xn=a,令f(x)=xn-a,则只需求f(x)=0时x的值即可.由上述简单推导知,当f(x)=0时 ...
- python迭代法求解方程_第一部分:趣味算法入门;第六题牛顿迭代法求一元三次方程的根...
100个不同类型的python语言趣味编程题 在求解的过程中培养编程兴趣,拓展编程思维,提高编程能力. 第一部分:趣味算法入门:第六题SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键 ...
- Python:牛顿迭代法求平方根
#69573 牛顿迭代法求平方根[光]-函数复用#69573 牛顿迭代法求平方根描述牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson meth ...
- Python趣味算法入门 - 牛顿迭代法求方程根
问题描述 编写用牛顿迭代法求方程根的函数.方程为,系数a,b,c,d由主函数输入,求x在1附近的一个实根.求出根后,由主函数输出. 牛顿迭代法的公式:,设迭代到 时结束. 分析 在网上可以找到很多关 ...
最新文章
- 浅谈Oracle Online redo log
- Oracle 11g R2安装过程中遇到的报错及解决办法
- 一些简单网络命令用法
- 计算机网络_第7版_谢希仁_目录
- 灰度图片维度与彩色图片维度-python-scikit-image包
- MySQL的insert ignore与replace into不同
- MongoDB最简单的入门教程之二 使用nodejs访问MongoDB
- Atitit 通过调用gui接口杀掉360杀毒 360卫士 qq保镖等难以结束的进程(javac# php )...
- 标定精度_【杰瑞课堂】工业机器人运动精度
- 初探Object in java
- mariadb multi-source replication(mariadb多主复制)
- 验证输入是否满足条件
- 联创宽带上网助手协议的简单分析(一)start包和off包
- 基于动物性去思考人性
- 每日内涵微信小程序-2-轮播图圆角
- VTK:图形基本操作进阶——连通区域分析
- 13个搭讪绝招助你告别单身
- mac使用的pd虚拟机window黑屏 ---已解决
- 项目经理如何激励自己的团队
- java中的匿名内部类总结