数值方法求π和π的x次方
数值方法求π和π的x次方
- 求π
- 求lnπ
- 求π的x次方
- 重中之重:误差分析
学习了数值分析这门课,老师留了一个作业是设计数值方法求π的x次方(x范围为1到10)
具体步骤如下(老师要求的,就是想让你多用用几种数值方法,让你多解几步)
- 求π
- 利用上一步的π求lnπ
- 利用上一步的lnπ求π的x次方
- 误差分析
不难
但是误差分析很麻烦,因为要考虑每一步的误差对下一步的影响,还需要考虑舍入误差和方法误差,误差分析在文章的末尾
求π
求解π的方法有很多,现在只讨论用计算机怎么求π。一般有下面这三种求法
1.泰勒展开
2.BBP公式
3.高斯勒让德算法(最好的一种)
这三种方法具体可以参考https://blog.csdn.net/xfxyy_sxfancy/article/details/48378121
这个博文很详细我就不再废话了,下面给出泰勒展开求π的C++代码,展开40项即可得到很精确的结果
int h1,i,t;double dsqrt3=2*sqrt(3);//dsqrt为2倍的根号3,是一个常量pi=dsqrt3;h1=1; //h1为正1或负1for(i=1;i<40;i++)//采用泰勒展开方法求π{t=2*i+1;h1=-h1;pi=pi+h1*dsqrt3/t/pow(3,i);}cout << "π的值:";cout << fixed << setprecision(15)<< pi << endl;
求lnπ
可以用数值积分的方式求
注意:上式中的π用的是第一步求出的π
数值积分有很多方法,比如梯形公式,辛普森公式等等
我采用的是复合辛普森公式(可能不是最好的),原理如下
C++代码如下
double h=(pi-1)/500;//pi即为上一步求的πlnpi=1+1/pi;//设定初值for(i=1;i<500;i++)//采用复合辛普森公式求数值积分{x2=1+i*h;x1=1+i*h-h/2;lnpi=lnpi+4/x1+2/x2;}lnpi=lnpi+4/(pi-h/2);lnpi=lnpi/6*h;cout << "lnπ的值:";cout << fixed << setprecision(15)<< lnpi << endl;
求π的x次方
要求用到前两步的结果,我采用求解常微分方程的方法
求解常微分方程也有很多方法,如各种欧拉法,龙格库塔,等等
我采用的是四阶龙格库塔公式,如下
C++代码如下,给了个龙格库塔的函数,该函数输入
x:几次方
n:区间分为几份,份数越多越精确
输出:pix,即结果,表示π的x次方
double RungKutta(double x,double n)//四阶龙格-库塔公式
{double pix,K1,K2,K3,K4,h;pix = 1.0;h=x/n;for(int i=0;i<n;i++){K1 = derivative(pix);K2 = derivative(pix+0.5*h*K1);K3 = derivative(pix+0.5*h*K2);K4 = derivative(pix+h*K3);pix = pix+h*(K1+2*K2+2*K3+K4)/6;}return pix;
}
double derivative(double y)//y(x)的导数,用于微分方程求解
{return (lnpi*y);//lnpi即自己求出的lnπ
}
重中之重:误差分析
这一部分的分析很多,足足有四页,因此在这里就不放了,详情请见评论区我给的链接,点开就是
数值方法求π和π的x次方相关推荐
- 我想知道怎么求N的N次方
我想知道怎么求N的N次方,这个数据是很大的,但是我要的是这个数据的最高位的数,应该有什么好的方法吧! 请大侠们帮帮忙吧!!(N <1000000000) 这个问题提出后,fallening同学便 ...
- a的n次方的最后三位数c语言,求13的n次方(12n≤130000000000)的最后三位数,用c++编程...
#include intmain() { longlonginti,x,y,last;/*变量last保存求X的Y次方过程中的部分乘积的后三位*/ //输入 while(scanf("%ll ...
- c语言学习-编写函数求x的n次方的值
编写函数求x的n次方的值 程序流程图: 代码: #include<stdio.h> long mul(int j ,int k) {int i; long mu=1; for(i=0;i& ...
- (c语言)求x的y次方
(c语言)求x的y次方,输入x和y的值,y为整数 #include<stdio.h> #include<stdlib.h> #include<math.h>//注意 ...
- 求次方的c语言程序,C语言编程求13的13次方的最后三位数
求13的13次方的最后三位数 *问题分析与算法设计 解本题最直接的方法是:将13累乘13次方截取最后三位即可. 但是由于计算机所能表示的整数范围有限,用这种"正确"的算法不可能得到 ...
- 【算法】求n的m次方(快速幂取模)
题目 求n的m次方,n,m均为自然数. 解析 看似简单的题目,但是要想写的高效还不是那么容易想出来. 实现 unsigned int power(unsigned int a, unsigned in ...
- java语言不用pow函数求x的n次方_X的N次方求解——pow(x,n)实现
最近看到这样的一个题目求X的N次方,自己想了一些解决办法,记录一下留作日后参考. 求X的N次方,首先暴力求解: int exp(int x, int n) { int ret = 1; for(int ...
- 递归算法之求x的n次方
求x的n次方–递归算法 #include<stdio.h> int power(int x,int n) {int y;if(n==0) y=1;else {y=power(x,n/2); ...
- python 求x的 n次方
1.求x的 n次方 def power(x, n): #如def power (x,n=2) 设置了n的默认值为2 s = 1 while n > 0: n = n - 1 s = s * x ...
最新文章
- python pycharm 包 安装问题
- 通过组策略禁用U盘执行病毒文件
- 互联网时代大数据的核心价值
- [JZOJ6075]【GDOI2019模拟2019.3.20】桥【DP】【线段树】
- 优化缩短关中断的时间
- 51nod 1525 重组公司
- SVM原理以及Tensorflow 实现SVM分类(附代码讲了一下原理)
- PTA学生成绩排序-C语言详解
- 基于python技术的自动化运维是干嘛的_《Python自动化运维 技术与最佳实践》.pdf...
- 分布式资本沈波:未来区块链杀手级应用将出现在“+区块链”
- uva-465(overflow)
- 解决PyInstaller打包程序exe在win7运行异常问题(OSError: [WinError 87] 参数错误、Error loading Python DLL python39.dll等)
- 戴毅茹同济matlab,Stateflow系统建模(全)解读.pptx
- 充一次电使用一年的手机_超级手机电池:充一次电用一年多?
- surface simplification using quadratic error metrics
- NOIP2018普及T2暨洛谷P5016 龙虎斗
- python 拓扑排序_python拓扑排序算法实现
- 新员工入职表_舞钢农商银行:组织新招录员工开展反假币培训
- win10系统中如何查看wifi密码
- 长沙银行“三重奏”:“生态银行”的新玩法