> 文档中心 > 【数值计算】期末综合大作业

【数值计算】期末综合大作业

目录

🐲 1.提出问题

🦄1.1具体问题描述    

🦄 1.2解决方案

🐲 2.分析问题

🦄 2.1基本思想

🦄 2.2基本原理

🐲 3.程序运行

🦄 3.1运行环境

🦄 3.2 程序代码

🦄 3.3 运行过程

🦄 3.4 运行结果

🐲 4.联系实际


🐲 1.提出问题

🦄1.1具体问题描述    

【描述问题】

如果在考虑空气阻力的情况下,通过编程去计算投射体撞击地面的时间和飞行路程。

其中:

 【输入形式】

在程序中输入三个数字,分别是

起始值、前后两次迭代差的绝对值精度、g(t)函数值的精度。

【输出形式】

第一行输出投射体撞击地面经过的时间

第二行输出投射体撞击地面前的飞行路程

注意:输出精确到小数点后10位

🦄 1.2解决方案

  1. 分析问题
  2. 采用的计算方法
  3. 用编程来实现
  4. 进行结果分析

 

🐲 2.分析问题

🦄 2.1基本思想

首先,要明确的是问题中提供的方程都是非线性方程。

其次,针对非线性方程的解决办法是(二分法,迭代法,弦割法和抛物线法)。

而根据这个问题就要采用牛顿迭代法,这是因为牛顿迭代法的两个主要应用方向是

  1. 目标函数最优化求解。
  2. 进行方程的求解。   

最后,牛顿迭代法的核心思想是对函数进行泰勒展开,本题也将采用这样的思想进行求解

🦄 2.2基本原理

前面已经明确使用牛顿迭代法解决问题,那么结束迭代的条件就是

  1. 前后两次迭代的差小于某一设定的精度
  2. 与渐进误差常数有关
  3. 与所给的函数的函数值精度有关

具体通过编程实现思路,如下:

  1. 先写主函数main() ,在函数体内部声明变量、精度、还有需要实现的函数功能,最后就是输出打印。
  2. 用两个函数g()和h()对两个方程g(t)和h(t)进行实现,其中h()就是实现投射体水平飞行路程的函数
  3. 再用函数g1()表示函数g(t)的求导方程
  4. 计算投射体水平飞行路程,用函数newton()来实现,这个也是牛顿迭代法的核心

🐲 3.程序运行

🦄 3.1运行环境

本题程序运行将在VS2022 中进行,采用的编程语言是C++。

🦄 3.2 程序代码

#define _CRT_SECURE_NO_WARNINGS 1#include#include#includedouble e = 2.718281828;using namespace std;double g(double t){return 9600 * (1 - pow(e, (-t / 15.0))) - 480 * t;//y=g(t)=9600*(1-e^(-t/15.0)) - 480*t}double h(double t){return 2400 * (1 - pow(e, (-t / 15.0)));//x=h(t)=2400*(1-e^(-t/15.0))。}double g1(double t){return 640 * pow(e, (-t / 15.0)) - 480;//求导得 y=g1(t)=640*(e^(-p/15.0))-480}double newton(double p0, double delta, double epsilon){double p1 = p0 - g(p0) / g1(p0);//迭代公式double err = abs(p1 - p0);//绝对误差double relerr = 2 * err / (abs(p1) + delta);//相对误差p0 = p1;//赋值循环double y = g(p0);if (err < delta || relerr < delta || abs(y) > p0 >> ddelta >> depsilon;double delta, epsilon;delta = pow(10, -ddelta);//精确度epsilon = pow(10, -depsilon);t = newton(p0, delta, epsilon);//求时间,牛顿法核心double x;x = h(t);//水平飞行距离cout << "投射体撞击地面时的时间:" << fixed << setprecision(10) << t << endl;cout << "投射体水平飞行路程:" << fixed << setprecision(10) << x;return 0;}

🦄 3.3 运行过程

将程序代码写好后,在VS2022中开始执行,这里提供两个测试用例

测试用例1:【输入】7 4 6

                    【输出】投射体撞击地面时的时间: 9.0878996662

                                  投射体水平飞行路程: 1090.5479598954

测试用例2:【输入】8 1 1

                    【输出】投射体撞击地面时的时间: 9.0895510206

                                  投射体水平飞行路程: 1090.6921099181

🦄 3.4 运行结果

 

 


🐲 4.联系实际

由于牛顿迭代法具有局部收敛性,所以需要提一个接近于根的初始位置才可以使用,

在这个问题中,使用牛顿迭代法迭代次数更少,可以最优化解决问题。

通过编程输入起始值、前后两次迭代差的绝对值精度、g(t)函数值的精度,就可以求出飞行时间和水平路程,

这个投射体问题,就是牛顿迭代法很好实现实例。牛顿迭代法还可以用于机器学习,在工程中求一个趋势的极值、传递函数参数辨识等应用。