基于C#实现(WinForm)求解SIN(X)数值分析

发布时间:2026/5/26 9:39:23

基于C#实现(WinForm)求解SIN(X)数值分析 ♻️ 资源大小1.60MB➡️资源下载https://download.csdn.net/download/s1t16/87430273数值分析一、需求分析本次大作业需要求解 sin(x)x 的取值范围是任意的需要保证算法能精确到小数点后 4 位需要对运算结果进行误差分析包括方法误差和舍入误差。根据分析得到误差确定迭代次数等。二、逼近法2.1 算法原理由于 sin( 2) sin() , ±1, ±2, …,首先将 x 归到[0,2]区间内0 ∈,2], () (0)。之后使用泰勒展开来逼近 sin(0)多项式项数足够高时即可满足精度:比如用前 k 项来近似(0) sin( 0)2.2 误差分析方法误差假设用泰勒展开的前 k 项来近似 sin()其中 ∈ [0, ]方法误差存储误差假设所有数据都用小数点后 m 位的变量来存储实际编程中用 double 型变量。首先将 x 归一化过程中可能需要加减, 所以 0 可能会带来误差误差for 循环运算过程中的每次计算结果的赋值也可能产生存储误差总误差其中m 为变量的存储位数double 型变量的 m 一般为 15。由于当 n 足够大时(2 1)! 21所以能达到任意精度。0 越大总误差越大所以考虑 0 2 的情况。取 k11得 . × 符合要求。三、常微分方程3.1 算法原理得出方程由于 sin( ) (1) sin() , ±1, ±2, …,首先将 x 归到区间内1 ∈。再将 1 化为为了使 f 的导数有范围0 ∈求出(0)后用倍角公式求出()。因为3.1.1 sin2(0) cos2(0) 1且′() cos()设() sin()所以在区间内欧拉公式设。将 0 到 0 的区间划分成 t份。使用公式3.1.2 1 (, )迭代计算 y直到 ntsin(0) 。再用倍角公式求出开根号由于运算过程中用到开根号运算所以需要用方程求根的方法计算。为了计算通过 1 φ(xk)的方式迭代计算。q1 sin2(0) ∈ [0,1]所以因此该方法迭代足够多次后可以收敛到3.2 误差分析方法误差局部截断误差设是第 n 步累积的方法误差方法累积误差因为所以构造等比数列存储误差假设所有数据都用小数点后 m 位的变量来存储实际编程中用 double 型变量。0 的存储误差会给带来误差同时每一步计算结果的存储也会带来误差。设是第 n 步存储误差的积累则构造等比数列又因为sin(0)总误差代入当 h 足够小时趋向常数通过控制 m可以达到任意精度。设总误差当四、cordic 算法4.1 算法原理cordic 算法使用角度逼近的方法迭代求得 sin()。首先将 x 的值归一化到区间使用公式以向量 0 (1,0)为初始向量向靠近 x 的方向旋转的角度大小得到向量 1;向量 1 再向靠近 x 的方向旋转的角度大小得到向量 2依次类推。即在第 i 步迭代时向量向靠近 x 的方向旋转的角度大小得到向量1。问题是向量 1 的坐标如何从向量的坐标计算得到。由坐标旋转公式其中正负由 x 的大小决定又因为由于所以都提前算好迭代足够多次后向量与 x 轴的夹角足够靠近角度 x可达到任意精度。4.2 误差分析方法误差当算法迭代到第 n 步时n 足够大如大于 5设向量与 x 轴的夹角为所求的角度为 x可认为 | | ≤ θn1因此因此方法误差存储误差设向量则其中, 都是提前算好的系数舍入误差为为变量的存储位数。设第 i 步 x 的舍入误差为y 的舍入误差为。所以其中 ≤ 1, i ≤ 1, || ≤ 1, || ≤ 1因此其中 0 0 0因此 总误差总误差随 n 的增大而减小通过控制 m可以达到任意精度。当 n15 时m15double 型变量的小数点后存储位数时总误差 ≤ . ×五、程序流程各个算法的思路已在第四部分叙述下面是算法的流程图Taylor 展开逼近法的流程图常微分方程方法的流程图cordic 算法的流程图六、计算代价与收敛速度各个算法的方法误差、舍入误差以及总体误差已在第四部分充分分析下面我们来分析一下各个算法的计算复杂度和收敛速度。Taylor 展开收敛速度Taylor 展开方法误差收敛速度计算代价Taylor 展开的方法由于在计算第 i 项时需要计算 2i-1 次幂所以总计算复杂度为由第四部分的分析知当 ≥ 11 时该方法误差满足要求,运算次数约为 121。常微分方程收敛速度常微分方程方法误差:其中趋近于常数 A则收敛速度计算代价常微分方程的算法由于需要用方程求根的方法来进行开根号操作所以运算复杂度为()其中 k 为方程求根算法的迭代次数在程序中设为 200。前面已经指出当≥ 12000 时可以满足误差要求运算次数 2400000。cordic 算法收敛速度cordic 算法方法误差收敛速度由于 x0 时所以当 n 足够大时计算代价cordic 算法一次只需要循环 n 次所以运算复杂度为()第四部分中已经说明当 ≥ 15 时满足误差要求运算次数约为 15。比较三种算法比较来看计算代价常微分方程算法 Taylor 展开逼近 cordic 算法 cordic 算法的运算次数远少于前两种算法。收敛速度所以常微分方程收敛速度最快Taylor 展开最慢cordic 算法收敛速度居中。综上所述cordic 算法计算代价小收敛速度居中其他两个算法收敛速度和计算代价互补。七、结果我用 c#编写了用户界面用户可以选择运算方法和迭代次数下面是用三种方法进行计算的结果。八、总结通过完成这次大作业我提高了运用理论知识解决实际问题的能力比如改进欧拉法、方程根的数值解等同时也学到了很多新知识比如 cordic 算法。这次大作业的难点在与误差分析在对实际问题的结果进行误差分析的过程中我加深了对方法误差和舍入误差的理解认识到了实际问题中误差分析的必要性。将一个数值算法投入应用中除了要考虑它的误差另一个重要因素是算法的复杂度cordic 算法的实现虽然需要提前准备一些数据但其运算速度很快这也是它被广泛应用的原因。此外我为我的程序设计了简单的用户界面感觉程序的实用性更强了。总之通过这次大作业我增长了很多新知识加深了对理论知识的理解也加强了我动手解决实际问题的能力。

相关新闻