- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图获得一个简单追逐问题的数值解
(动靶+定速模块火箭)
每次迭代我的速度模块都会减少一点,将误差加起来;在几百次迭代之后,错误爆发,速度急剧下降。
但是,使用 Euler 方法(大块下方的代码)时,情况并非如此,它仅在使用 RK4 方法时弹出。
我不确定错误在哪里以及为什么会发生,所以欢迎任何意见
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
#define vx(t,x,y) n*V*((t)*(V)-(x))/pow(((t)*(V)-(x))*((t)*(V)-(x))+((h)-(y))*((h)-(y)),0.5)
#define vy(t,y,x) n*V*((h)-(y))/pow(((t)*(V)-(x))*((t)*(V)-(x))+((h)-(y))*((h)-(y)),0.5)
using namespace std;
class Vector {
public:
double x,y;
Vector(double xx, double yy):x(xx), y(yy){};
virtual ~Vector(){}
Vector operator-() {return Vector(-x,-y);};
friend Vector operator-(const Vector &, const Vector &);
friend Vector operator+(const Vector &, const Vector &);
Vector operator*(double l){return Vector(x*l,y*l);};
friend Vector operator*(double, const Vector &);
Vector operator/(double l){return Vector(x/l,y/l);};
void operator+=(const Vector & v ){ x+=v.x; y+=v.y;};
void operator-=(const Vector & v ){ x-=v.x; y-=v.y;};
void operator/=(const Vector & v ){ x/=v.x; y/=v.y;};
friend ostream & operator<<(ostream & os,const Vector & v){os<<"("<<v.x<<", "<<v.y<<")";return os;};
double norm() {return sqrt(x*x+y*y);};
};
Vector operator-(const Vector & v1, const Vector & v2){
return Vector(v1.x-v2.x,v1.y-v2.y);
}
Vector operator+(const Vector & v1, const Vector & v2){
return Vector(v1.x+v2.x,v1.y+v2.y);
}
Vector operator*(double l, const Vector & v){
return Vector(v.x*l,v.y*l);
}
int main() {
Vector posP(0,0);
double V=100.,t = 0,dt = pow(10.,-2),vx,vy,h=1000.,x,y,n=2.,v;
double kx1,kx2,kx3,kx4,ky1,ky2,ky3,ky4;
Vector posE(0,h);
FILE *fp;
fp = fopen("/Users/Philipp/Desktop/a.dat","w");
while(posP.y<(h)){
posE.x=posE.x+V*dt;
x=posP.x;y=posP.y;
kx1 = vx(t,x,y);
ky1 = vy(t,y,x);
kx2 = vx(t+dt/2.0,x+kx1/2.0,y+ky1/2.0);
ky2 = vy(t+dt/2.0,y+ky1/2.0,x+kx1/2.0);
kx3 = vx(t+dt/2.0,x+kx2/2.0,y+ky2/2.0);
ky3 = vy(t+dt/2.0,y+ky2/2.0,x+kx2/2.0);
kx4 = vx(t+dt,x+kx3,y+ky3);
ky4 = vy(t+dt,y+ky3,x+kx3);
posP.x = posP.x + dt*((kx1 + 2.0*(kx2+kx3) + kx4)/6.0);
posP.y = posP.y + dt*((ky1 + 2.0*(ky2+ky3) + ky4)/6.0);
v=sqrt(((kx1 + 2.0*(kx2+kx3) + kx4)/(6.0))*((kx1 + 2.0*(kx2+kx3) + kx4)/(6.0))+((ky1 + 2.0*(ky2+ky3) + ky4)/(6.0))*((ky1 + 2.0*(ky2+ky3) + ky4)/(6.0)));
t+=dt;
if ((posE-posP).norm()<1) break;
fprintf(fp,"%lf %lf %lf %lf \n",posP.x, posP.y, v, t);
}
fclose(fp);
return 0;
}
欧拉方法
//Euler cycle
while(posP.y<(h)) {
posE.x=posE.x+V*dt;
x=posP.x;y=posP.y;
vx=vx(t,x,y);
vy=vy(t,y,x);
posP.x=posP.x+vx*dt;
posP.y=posP.y+vy*dt;
t+=dt;
if ((posE-posP).norm()<0.1) break;
fprintf(fp,"%lf %lf %lf \n",posP.x, posP.y,vx*vx+vy*vy, t);
//速度模块在第三列,你可以看到一切都是 200,而不是 RK4 的情况,即使是第一次迭代它也会下降到 ~199.99985
}
最佳答案
你用
kx2 = vx(t+dt/2.0,x+kx1/2.0,y+ky1/2.0);
但应该是:
kx2 = vx(t+dt/2.0,x+kx1/2.0*dt,y+ky1/2.0*dt);
以后也类似。或者,您可以将所有 k 值乘以 dt:
kx2 = dt*vx(t+dt/2.0,x+kx1/2.0,y+ky1/2.0);
这两个变体对于隐式 Runge-Kutta 方法更为重要
关于c++ - Runge-Kutta 四阶法迭代时的累积误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40657554/
美好的一天! 我正在制作一个出勤检查程序,单击一次时显示橙色按钮,单击两次时显示红色按钮,单击 3 次时显示黑色按钮。我在如何累积 getClickCount() 值方面遇到问题,因为对于按钮要注册
我似乎无法在 Adobe 网站上找到明确的答案。使用 ColdFusion 10,11 甚至 2016,更新(修补程序)是否累积? 例如,ColdFusion 的修补程序高达 hotfix_023
我是随机森林新手,我有一个关于回归的问题。我正在使用 R 包 randomForests 来计算 RF 模型。 我的最终目标是选择对预测连续性状很重要的变量集,因此我正在计算一个模型,然后删除准确度平
目前我们有一个发布/消费者服务,消费者将收到的消息写入 AWS S3。我们目前每月编写超过 100.000.000 个对象。但是,我们可以根据一些规则对这些消息进行分组,以节省一些钱。这些规则可以是这
假设我有一个二叉树: data BinTree a = Nil | Branch a (BinTree a) (BinTree a) 我想在这样的结构上做一个累积映射: mapAccum ::
我正在使用内核估计,我应用了 density函数从 R 到我的数据文件(双变量),经过几次统计处理后,我需要转换这些数据,这就是我的问题: 是否有非参数方法的逆累积分布函数? 我尝试过 Google、
不确定以前是否有人问过这个问题,尝试搜索它但找不到任何相关内容。 我试图获得一个累积的字符串聚合,即仅运行不同值的聚合。这是我正在寻找的结果的示例。 我尝试使用 string_agg 函数,但它仅在用
我想找到累积的 bind.rows。这是我想要实现的小例子。我将使用 dslabs 包中的 gapminder 数据集进行演示。 library(tidyverse) library(dslabs)
在 Linux 中使用 tomcat 进程时,我们观察到时间字段显示5506:34(累积 CPU 时间)。在探索时,这是在进程的整个生命周期中运行所花费的 CPU 时间的百分比。 由于这是一个 Jav
我有一些数据可以使用 pyparsing 中的 OneorMore 函数进行解析。比如, fun = OneorMore( foo.setResultsName("foo") + bar.setRe
我试图弄清楚是否有一种简单的方法可以解决 pandas 的以下问题。假设我有四个容器,A、B、C、D,每个容器都有特定的体积。假设我现在得到了一定量的液体,我想用它来填充这些容器。我怎样才能想出一个“
我正在尝试编写一个函数来检测所有上升沿 - 向量中值超过特定阈值的索引。这里描述了类似的东西:Python rising/falling edge oscilloscope-like trigger
这个问题在这里已经有了答案: Multiplying elements of a column in skipping an element after each iteration (3 个答案)
有没有办法获取数据框中每一行的值计数? |f1|f2| ------- v1 | a value_counts -> {a:1} v2 | a value_counts -> {a:2} v3 |
我目前正在尝试对我正在构建的计算器(使用复合模式)进行测试。第一种方法应该添加 75 美元,效果很好,但是当第二种方法运行时,“服务”被重置并且有0 美元作为工作成本。如果我将这两种方法合二为一,那么
我有一个如下所示的文档: 数据.txt 100, "some text" 101, "more text" 102, "even more text" 我使用正则表达式处理它并返回一个新的处理文档,如
假设我有这个: function getAllPromises(key: string, val: any): Promise { const subDeps = someHash[key]; c
我在 mysql 中有表“cumul_sum”,我想根据条件划分“cumulative”列,即如果此列中的值 >= 70,则这些值应存储在名为“others”的新列中"并且前面应该存放对应的sku_i
我正在做一个用 C++ 刺激 ATM 的项目,但在使用累加器时遇到了一些问题,我的问题是:我正在使用开关(这里是情况 1)来更改在包含的函数中声明的 2 个变量的值switch(),但是值只在情况 1
我希望能够使用 accumulate 对 vector 中的每隔一对元素进行累加。我尝试了以下但没有成功,为非空、非零 vector 返回错误 return std::accumulate(vec.b
我是一名优秀的程序员,十分优秀!