当前位置:
文档之家› 数值分析第二次大作业——编写ln函数实验报告
数值分析第二次大作业——编写ln函数实验报告
为一个整体,将 ln(a)进行 Taylor 级数分解,进而按式计算可以求得 ln(x)的值。由于我们选 取级数的前 n 项和近似 ln(a),则有:
Rn (a
1)
(1)n
(a 1)n1 n 1
…;
|
Rn
(a
1)
||
(a 1)n1 n 1
|
。
2
自 92 乔晖 2009011414
精度为 20 位,即 h4 1020 。
int * GetNumber() {return number;}
//获得大数中的整数数组
bool GetSgn() const {return sgn;}
//获得大数的符号
bool IsZero();
//判断大数是否为 0
CBigNumber Reverse() {sgn = !sgn;return *this;} //取相反数
数值分析——编写 ln 函数
实验报告
自 92 乔晖 2009011414
自 92 乔晖 2009011414
数值分析——编写 ln 函数实验报告
目录
一、 实验任务 ................................................... 2
二、 编译环境 ................................................... 2
1u
x 1
35
5
自 92 乔晖 2009011414
数值分析——编写 ln 函数实验报告
其前 n 项和,近似可得 ln(x)的值。
基于以上原理,可以设计迭代算法,累加 2u2i1 得到前 n 项和。每次计算后,判断计 2i 1
算的终止条件,即余项
|
Rn
(u)|
|
(1
2u 2 n 1 u2 )(2n
2
3
ln(a)的值。余项 |
Rn (a
1)
||
(a 1)n1 n 1
|
。
基于以上原理,可以设计迭代算法,累加 (1)i1 (a 1)i 得到前 n 项和。每次计算后, i
判断计算的终止条件,即余项的值是否符合精度要求,符合则退出循环。具体代码见附录。
1.2 换元 Taylor 法
根据计算式: x 1 u (u (1,1)) ; u x 1 。 ln(x) (2 u u3 u5 …)。我们取
七、 实验结果 .................................................. 14
八、 心得体会 .................................................. 16
附录 ............................................................. 16
{
number[i] = n[i];
}
this->sgn = sgn;
}
friend ostream& operator << (ostream& out, CBigNumber& bn);//标准流输出 CBigNumber operator + (CBigNumber& bn); //大数与大数的加法
CBigNumber operator - (CBigNumber& bn); //大数与大数的减法
CBigNumber operator * (CBigNumber& bn); //大数与大数的乘法
CBigNumber operator * (int n);
//大数与整数的乘法
CBigNumber operator / (CBigNumber& bn); //大数与大数的除法
Rn
(u
)
(2
u 2 n1 2n 1
…);
|
Rn
(u)|
|(2 u2n1
u2n3 2n
u2n5 1
…
)|=|
(1
2u 2 n1 u2 )(2n
1)
|
。
因此,根据精度的要求,可以计算出 n。
常微分方程求解——四阶龙格库塔公式
y ln(x) ,y f (x, y) d ln(x) 1 。采用常微分方程求解的方法,即利用 y 1 以
用taylor级数展开
void Taulor_FormerMethod(CBigNumber x);//先变元再用泰勒级数求ln(x),令
x=(1+u)/(1-u),化为关于u的taylor级数
void RKMethod(CBigNumber x);
//四阶龙格——库塔公式
CBigNumber exp(CBigNumber x); //求e^x
void NewTon(CBigNumber x); //牛顿迭代公式解非线性方程
2. 数据结构分析
由于 C 语言中的 double 数据类型只有 16 位有效数字,不能达到需要的运算精度,所
以需要自己编写基本数据存储结构。程序中用自己写的大数类 class CBigNumber 来存放高 精度数字并在其中封装了相应的加减乘除等操作。
五、 程序框图 ................................................... 9
六、 误差分析 ................................................... 9 1. 减半 Taylor 法 .............................................. 9 2. 换元 Taylor 法 ............................................. 11 3. 经典四阶龙格——库塔算法 .................................. 11 4. 牛顿迭代公式 .............................................. 12
1
自 92 乔晖 2009011414
数值分析拟计算器的 ln 函数,能够计算 ln(x)(x>0),要求最后结果有 20 位有效数字。 算法需要考虑方法误差和存储误差等影响因素。
要求: 1.建议程序用 C 语言编写,此程序不要求界面。 2.自行编写全部算法。 3.报告内容需完整,算法设计、程序框图、实验结果及误差分析等步骤不可缺少。
三、 任务分析 ................................................... 2 1. 数值方法分析 ............................................... 2 2. 数据结构分析 ............................................... 4
数值分析——编写 ln 函数实验报告
因此,根据精度的要求,可以用 |
Rn
(a
1)
||
(a 1)n1 n 1
|
计算出应该展开的阶数
n。
(2) 换元 Taylor 法 同(1)中方法设计的目的,为了保证 Taylor 级数的使用,必须满足收敛域的要求。我们
令 x 1 u (u (1,1)) ,则有: 1u ln(x) ln(1 u ) ln(1 u) ln(1 u) 1 u
void SetSgn(bool flag){sgn=flag;}
//设置符号
private: int number[SIZE]; bool sgn;
};
//大数数组 //大数符号
大数封装在整数数组中,其中预留了 20 位整数部分和 40 位小数部分(整数数组的总
长度是 60)。大数可以写成 dn 10n , dn 存储在数组的 20-n 位。 n
CBigNumber operator / (int n);
//大数与整数的除法
bool operator > (CBigNumber& bn);
//大数之间比较大小
bool operator < (CBigNumber& bn);
4
自 92 乔晖 2009011414
数值分析——编写 ln 函数实验报告
由于 u 的定义域满足收敛域的要求,我们可以将 ln(1+u),ln(1-u)分别展开,进行计算:
ln(1 u) u u2 u3 …; 23
ln(1 u) u u2 u3 …; 23
ln(x) (2 u u3 u5 …)。 35
由于我们选取级数的前 n 项和近似 ln(x),则有:
四、 算法设计 ................................................... 5 1. 数值算法 ................................................. 5 1.1 减半 Taylor 法 ......................................... 5 1.2 换元 Taylor 法 ......................................... 5 1.3 经典四阶龙格——库塔算法 .............................. 6 1.4 牛顿迭代公式 .......................................... 7 2. 高精度运算算法 ........................................... 7