c语言调用数学函数根号,不调用库函数求根号x的计算方法(二分/三分/牛顿迭代法)...
求:y=√x
1.二分法求零点
由于函数在(0,+oo)为单调函数,取值为正
y*y - x = 0 设 g(y) = y*y - x ,函数值在自变量y属于(0,+oo)也单调。g(0)<=0 ,g(x+1)>0 所以可在区间[0,x+1]上采用二分法
#includeconst double eps=1e-10;//精度小数点后10位
//求y=根号x
//则y^2=x
double Abs(double val) {//求val的绝对值
if (val < 0)
val = -val;
return val;
}
int main(void) {
double x;
scanf("%lf", &x);
double l = 0, r = x + 1, mid = l;
while (Abs(r - l) > eps) {//区间长度大于eps就继续二分区间
mid = (l + r) / 2;
if (mid * mid > x)
r = mid;
else
l = mid;
}
printf("%.20f", mid);
return 0;
}
二分法的时间复杂度为 log2(x/精度)
eg.
输入:2
输出:1.41421356229693630000
2.三分法求极值
求√a,需构造函数。由于 a+b>=2√(ab) [当且仅当a等于b时,原式取等]。所以构造函数:
y = x+a/x (a>0)
只有当x=√a时,y可取得极小值。然后三分区间 ( 0, a + 1],当函数求得极值时即求得横坐标 ans = x
#includeconst double eps=1e-10;//精度小数点后10位
double Abs(double val) {//求val的绝对值
if (val < 0)
val = -val;
return val;
}
double func(double a, double x){//构造的函数,在(0,+oo)上有唯一的极值
return x+a/x;
}
int main(void) {
double x;
scanf("%lf", &x);
double l = eps, r = x + 1, lm, rm;
while (Abs(r - l) > eps) {
lm = (l*2+r)/3;
rm = (r*2+l)/3;
double fl = func(x,lm);
double fr = func(x, rm);
if(fl
三分法的时间复杂度为 log1.5 (x/精度)
eg.
输入:2
输出:1.41421357309081250000
3.牛顿迭代法 (学过数学的真nb)
//推荐 https://blog.csdn.net/xdu_pyl/article/details/46786167
f(x) = 0
利用泰勒公式,在x0处展开到一阶,即f(x) = f(x0)+f'(x0)*(x-x0) + 误差
设g(x) = f(x0)+f'(x0)*(x-x0) 即f(x)在点x0处的切线
令g(x)=0,解上式得 x = x0 - f(x0)/f'(x0) 设x1 = x
f(x1)比f(x0) 更接近f(x), 得递推式 x[n+1]=x[n] - f(x[n])/f'(x[n])
--
设f(x)=x*x-a=0
则递推式为 x[n+1] = x[n] - (x[n]*x[n]-a)/(2*x[n]) 即 x[n+1] = x[n]/2+a/(2*x[n])
#includeconst int N=100;
int main(void) {
double a;
scanf("%lf", &a);
double xn=1;
for(int i=0;i
牛顿迭代法的时间复杂度 可以取决于迭代次数,一般收敛得很快
输入:2
输出:1.41421356237309490000
比较:
二分法:2 输出:1.41421356229693630000
三分法:2 输出:1.41421357309081250000
牛顿法:2 输出:1.41421356237309490000
输出:1.41421356237309504880..
二分法:102365789 输出: 10117.59798568808400000000
三分法:102365789 输出: 10117.59819612991900000000
牛顿法:102365789 输出: 10117.59798568810600000000
输出: 10117.59798568810501243327
结论:
在浮点数运算有误差的情况下,三分法效果最差,二分法适中,牛顿迭代法最精确且时间复杂度低,编程难度最小
c语言调用数学函数根号,不调用库函数求根号x的计算方法(二分/三分/牛顿迭代法)...相关推荐
- 用c语言绘制数学函数图像,用c语言画数学函数图像.DOC
用c语言画数学函数图像 时间:2007-02-13 作者:佚名 编辑:本站 点击: 2231 [评论] 符 outtextxy(CX+3,440-40*i,s); //以字符形式输出纵轴上的单位数字 ...
- python中可以使用变量来引用函数吗_如何在python语言中使用函数变量并调用函数...
在python语言中,除了常规变量之外,还有函数变量.把函数本身赋值给变量,这个变量为函数变量. 工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 在已新建的python文件 ...
- c语言习题 定义函数 areaT,功能是求梯形面积。要求在主函数中输入上底(用变量 a存储)、下底(用变量 b 存储)、和高(用变量 h 存储),在主函数中调用函数 areaT,输出梯形面积(用变量
定义函数 areaT,功能是求梯形面积.要求在主函数中输入上底(用变量 a存储).下底(用变量 b 存储).和高(用变量 h 存储),在主函数中调用函数 areaT,输出梯形面积(用变量 s 存储)的 ...
- R第七问 R语言常用数学函数
语言的数学运算和一些简单的函数整理如下: 向量可以进行那些常规的算术运算,不同长度的向量可以相加,这种情况下最短的向量将被循环使用. 改变编译环境的语言(英语) Sys.setenv(LANGUAGE ...
- C语言-常用数学函数
C语言提供了很多编写好的函数,供用户在编程时使用,这些函数被称为库函数,使用前一定要有#include命令将头文件包含进来.例如常用的printf()和scanf()函数就是需要先包含头文件#in ...
- python函数定义及调用-Python:函数定义和调用时都加*,有什么作用?
参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...
- python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解
前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...
- java怎么调用存储函数_java中调用存储过程或存储函数的方法
java中调用存储过程或存储函数的方法 1.调用存储过程:CallableStatement clstmt = null;try {clstmt = conn.prepareCall("{c ...
- python函数定义和调用_函数定义和调用
定义函数 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述 ...
- python函数的嵌套调用_python函数的嵌套调用
我们之前的代码都是定义函数然后直接调用,但是没有在一个函数内调用另外一个函数,今天就感受下函数嵌套调用. 提示:如果你想当然的认为函数嵌套是在函数内部又嵌套定义一个函数这种操作的话,那么这叫做闭包.相 ...
最新文章
- 不吹牛会死!国内音乐平台进入“大逃杀”
- MapReduce编写实现wordcount词频统计
- c语言填空三个数找中间大小,计算机文化基础复习题及答案(精华)
- 初进JAVA职场面试小技巧:一个老学长的吐血之作!
- WCF X.509验证
- java 顺序存储键值对_java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)...
- Android TextView跑马灯效果与设置文字阴影
- C语言:将数组中的第一个数与最后一个数,第二个数与倒数第二个数依次完成镜像对调
- 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密
- C语言文件读写操作中缓冲区问题和setbuf函数详解
- CSDN获得积分和C币的方法
- 学计算机的人可以定位找人吗,电脑如何实现查找“附近的人”?
- Android 常用的控件总结
- layui搭建管理后台系统
- MacBook下使用VirtualBox虚拟Win7时设置分辨率为2560*1440
- 第四篇:奇点临近,时代呼唤物联网的到来!
- 增长:IT运维发展趋势报告
- SPSS如何做离散和连续变量的统计描述
- 6款提升办公效率的超牛软件,从此告别加班
- 软件测试中的网络问题