logo资料库

自由落体运动轨迹.pdf

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
数值积分法大作业 一 实验问题的描述 实现自由落体运动的轨迹求解。 h  v v   g       D v h ( , ) m v 0  100 / m s h 0 ,  10000 , m m  ,阻力系数 kg 5 dC  0.02 ,小球半径 r m 0.1 , g 0  9.81 / m s 2 ,重力加速度取常数,大气密度采用插值计算。求落 地速度和落地时间,观察速度的变化规律。 大气密度变化规律: [高度/M] 0.0 1000 3000 5000 7000 9000 11000 15000 20000 [密度/kg/m^3] 1.225 1.112 0.909 0.736 0.589 0.466 0.364 0.194 0.088 二 实验要求 1.在 VC 环境下,用 C 语言编写程序; 2.编写通过编译和运行; 3.要求至少采用欧拉法和四阶龙格库塔法两种方法进行积分; 4.将计算结果中的高度、速度数据用曲线的形式表示。可将数据导在 matlab 中 绘图,也可使用 origin 等软件绘图; 5.分析速度的变化规律; 6.可尝试不同的步长对结果的影响; 7.建议先不考虑阻力的影响,分析仿真结果的正确性,在保证仿真结果正确后在 考虑阻力的计算; 三 实验原理和方法 1)欧拉积分 2)二阶龙格库塔 x n   1 x n   h f x t , n ( n )
3)四阶龙格库塔 四 编程思路及方法 根据老师示例方法,在方程右函数中考虑空气阻力的影响,空气密度由已知数据 进行插值得到,插值方法为拉格朗日法,龙格库塔法编程过程中注意所设变量之 间的对应关系。 五 实验结果及分析 1.实验结果图表 欧拉法 112121()2(,)(,)nnnnnnhxxkkkftxkfthxhk11234612122322243(22)(,)(,)(,)(,)hiiiihhiihhiiiixxKKKKKftxKftxKKftxKKfthxhK
二阶龙哥库塔法 四阶龙哥库塔法
2.在程序循环到高度小于零时速度值已不可信,这是因为在编程时未考虑到高度 小于零时的公式符号变化,此时数据已无实际意义,所以我没有修改; 3.小球落地时的速度值可由 txt 文件查询到分别为 欧拉法 354.883886m/s 二阶龙哥库塔法 354.869480m/s 四阶龙哥库塔法 354.844668m/s 小球落地时循环步数可由 txt 文件查询到,再乘以步长即可得到时间 欧拉法 59.22s 二阶龙哥库塔法 59.22s 四阶龙哥库塔法 59.21s 均为落地前一秒的数值近似得到 六 心得体会
通过本次试验,使我对这门课程的相关知识有了一个更深的了解,运 用 C 语言编程的方式也让我的逻辑思维能力和编程能力有了一定的 提高。 附:实验代码 #include #include #include void Euler(double t, double h, double* x, double* f); void Fct(double t, double h, double* x, double* f); void runge_kutta2(double t, double h, double* x, double* f); void runge_kutta4(double t, double h, double* x, double* f); double lagrange(double* x); int main(int argc, char* argv[]) { FILE* fp; fp = fopen("D:\\test.txt", "w"); if (fp == NULL) { } double t; for (t = t0; t
double x1[2]; Fct(t, h, x, f); x[0] = x1[0]; x[1] = x1[1]; x1[0] = x[0] + h*f[0]; x1[1] = x[1] + h*f[1]; } fclose(fp); return 0; } void Euler(double t, double h, double* x, double* f) { } void rnge_kutta2(double t, double h, double* x, double* f) { double k1[2],k2[2],x1[2]; Fct(t,h,x,f); k1[0]=f[0]; k1[1]=f[1]; x1[0]=x[0]+h*k1[0]; x1[1]=x[1]+h*k1[1]; Fct(t+h/2,h,x1,f); k2[0]=f[0]; k2[1]=f[1]; x1[0]=x[0]+h/2*(k2[0]+k1[0]); x1[1]=x[1]+h/2*(k2[1]+k1[1]); x[0] = x1[0]; x[1] = x1[1]; } void rnge_kutta4(double t, double h, double* x, double* f) { double k1[2],k2[2],k3[2],k4[2],x1[2];
Fct(t,h,x,f); k1[0]=f[0]; k1[1]=f[1]; x1[0]=x[0]+h/2*k1[0]; x1[1]=x[1]+h/2*k1[1]; Fct(t+h/2,h,x1,f); k2[0]=f[0]; k2[1]=f[1]; x1[0]=x[0]+h/2*k2[0]; x1[1]=x[1]+h/2*k2[1]; Fct(t+h/2,h,x1,f); k3[0]=f[0]; k3[1]=f[1]; x1[0]=x[0]+h*k3[0]; x1[1]=x[1]+h*k3[1]; Fct(t+h,h,x1,f); k4[0]=f[0]; k4[1]=f[1]; x1[0]=x[0]+h/6*(k1[0]+2*k2[0]+2*k3[0]+k4[0]); x1[1]=x[1]+h/6*(k1[1]+2*k2[1]+2*k3[1]+k4[1]); x[0]=x1[0]; x[1]=x1[1]; } void Fct(double t, double h, double* x, double* f) { double den; } double lagrange(double* x) { double g = 9.81; f[0] = x[1]; den = lagrange(x); f[1] = -5*g+0.5*0.02*3.14*0.05*0.05*x[1]*x[1]*den;
double p, md1 = 0; double gd[9] = { 0.0, 1000, 3000, 5000, 7000, 9000, 11000, 15000, 20000}; double md[9] = { 1.225, 1.112, 0.909, 0.736, 0.589, 0.466, 0.364, 0.194, 0.088}; if (i != j) { } p = p * ((x[0] - gd[j]) / (gd[i] - gd[j])); int n=9; int i, j; } for (i = 0; i < n; i++) { p = 1; for (j = 0; j < n; j++) { } md1 = md1 + p * md[i]; } return md1;
分享到:
收藏