- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使我的 runge-kutta 四阶代码模块化。我不想每次使用时都必须编写和声明代码,但是 在 .hpp 和 .cpp 文件中声明它以单独使用 .但我遇到了一些问题。一般来说,我想求解一个 n 维方程组。为此,我使用了两个函数:一个用于方程组,另一个用于 runge-kutta 方法,如下所示:
double F(double t, double x[], int eq)
{
// System equations
if (eq == 0) { return (x[1]); }
else if (eq == 1) { return (gama * sin(OMEGA*t) - zeta * x[1] - alpha * x[0] - beta * pow(x[0], 3) - chi * x[2]); }
else if (eq == 2) { return (-kappa * x[1] - phi * x[2]); }
else { return 0; }
}
void rk4(double &t, double x[], double step)
{
double x_temp1[sistvar], x_temp2[sistvar], x_temp3[sistvar];
double k1[sistvar], k2[sistvar], k3[sistvar], k4[sistvar];
int j;
for (j = 0; j < sistvar; j++)
{
x_temp1[j] = x[j] + 0.5*(k1[j] = step * F(t, x, j));
}
for (j = 0; j < sistvar; j++)
{
x_temp2[j] = x[j] + 0.5*(k2[j] = step * F(t + 0.5 * step, x_temp1, j));
}
for (j = 0; j < sistvar; j++)
{
x_temp3[j] = x[j] + (k3[j] = step * F(t + 0.5 * step, x_temp2, j));
}
for (j = 0; j < sistvar; j++)
{
k4[j] = step * F(t + step, x_temp3, j);
}
for (j = 0; j < sistvar; j++)
{
x[j] += (k1[j] + 2 * k2[j] + 2 * k3[j] + k4[j]) / 6.0;
}
t += step;
}
gama
,
OMEGA
,
zeta
,
alpha
,
beta
,
chi
,
kappa
和
phi
是我想从 .txt 文件中读取的全局变量。我已经设法做到了,但是只在一个包含所有代码的 .cpp 文件中。
sistvar
是系统维度,也是一个全局变量。我正在尝试将其作为参数输入
F
.但是它的编写方式似乎给出了错误,因为 sistvar 是一个 const 并且不能作为变量进行更改,而且我不能将变量放入数组的大小中。
F
时一样。里面
rk4
,
eq
需要号码。
double F(double t, std::vector<double> x, int eq)
{
// System Equations
if (eq == 0) { return (x[1]); }
else if (eq == 1) { return (gama * sin(OMEGA*t) - zeta * x[1] - alpha * x[0] - beta * pow(x[0], 3) - chi * x[2]); }
else if (eq == 2) { return (-kappa * x[1] - phi * x[2]); }
else { return 0; }
}
double rk4(double &t, std::vector<double> &x, double step, const int dim)
{
std::vector<double> x_temp1(dim), x_temp2(dim), x_temp3(dim);
std::vector<double> k1(dim), k2(dim), k3(dim), k4(dim);
int j;
for (j = 0; j < dim; j++) {
x_temp1[j] = x[j] + 0.5*(k1[j] = step * F(t, x, j));
}
for (j = 0; j < dim; j++) {
x_temp2[j] = x[j] + 0.5*(k2[j] = step * F(t + 0.5 * step, x_temp1, j));
}
for (j = 0; j < dim; j++) {
x_temp3[j] = x[j] + (k3[j] = step * F(t + 0.5 * step, x_temp2, j));
}
for (j = 0; j < dim; j++) {
k4[j] = step * F(t + step, x_temp3, j);
}
for (j = 0; j < dim; j++) {
x[j] += (k1[j] + 2 * k2[j] + 2 * k3[j] + k4[j]) / 6.0;
}
t += step;
for (j = 0; j < dim; j++) {
return x[j];
}
}
vector array
2.434 s | | 0.859 s
2.443 s | | 0.845 s
2.314 s | | 0.883 s
2.418 s | | 0.884 s
2.505 s | | 0.852 s
2.428 s | | 0.923 s
2.097 s | | 0.814 s
2.266 s | | 0.922 s
2.133 s | | 0.954 s
2.266 s | | 0.868 s
_______ _______
average = 2.330 s average = 0.880 s
最佳答案
使用 vector 函数,其中 vector 算术取自 Eigen3
#include <eigen3/Eigen/Dense>
using namespace Eigen;
VectorXd Func(const double t, const VectorXd& x)
{ // equations for solving simple harmonic oscillator
Vector3d dxdt;
dxdt[0] = x[1];
dxdt[1] = gama * sin(OMEGA*t) - zeta * x[1] - alpha * x[0] - beta * pow(x[0], 3) - chi * x[2];
dxdt[2] = -kappa * x[1] - phi * x[2];
return dxdt;
}
MatrixXd RK4(VectorXd Func(double t, const VectorXd& y), const Ref<const VectorXd>& y0, double t, double h, int step_num)
{
MatrixXd y(y0.rows(), step_num );
VectorXd k1, k2, k3, k4;
y.col(0) = y0;
for (int i=1; i<step_num; i++){
k1 = Func(t, y.col(i-1));
k2 = Func(t+0.5*h, y.col(i-1)+0.5*h*k1);
k3 = Func(t+0.5*h, y.col(i-1)+0.5*h*k2);
k4 = Func(t+h, y.col(i-1)+h*k3);
y.col(i) = y.col(i-1) + (k1 + 2*k2 + 2*k3 + k4)*h/6;
t = t+h;
}
return y.transpose();
}
关于c++ - 为 n 维系统实现模块化 Runge-kutta 4 阶方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231161/
我一直在尝试将 RK4 集成到我正在做的模拟中。下面的函数是我基于第 12 页 this 上的方程式使用 RK4 对 3 维力场进行积分的最佳尝试。网站。 在我的代码中,粒子类主要存储速度和位置列表,
我试图获得一个简单追逐问题的数值解 (动靶+定速模块火箭) 每次迭代我的速度模块都会减少一点,将误差加起来;在几百次迭代之后,错误爆发,速度急剧下降。 但是,使用 Euler 方法(大块下方的代码)时
有人要求我解这个微分方程: (x,y,vx,vy)'=(vx,vy,vy,-vx) 它应该返回周期为 2*pi 的圆周运动。我实现了功能: class FunzioneBase { public:
我一直在研究四阶龙格-库塔求解器,但遇到了一些困难。我已经根据文章 on gafferongames 编写了求解器,但是当我运行一个包含的小例子时,我得到的错误比我用简单的欧拉积分得到的错误要糟糕得多
几乎每个游戏都倾向于使用一些游戏循环。 Gafferongames 有一篇关于如何制作精心设计的游戏循环的好文章:http://gafferongames.com/game-physics/fix-y
我有以下微分方程组: 根据他们告诉我的论文,我可以使用 RK 四阶数值求解它。 如您所见,最后两个方程是耦合的,我构造了一个关联 xn 和 yn 的矩阵(概率),其中 n = 1..(例如,N- 对数
我正在使用 Runge-Kutta 四阶方法数值求解具有四次势的弯曲时空背景标量场的常见运动方程: $\phi^{''}=-3\left(1+\frac{H^{'}}{3H}\right)\phi^{
我用 C++ 编写了一个程序来求解微分方程。问题是,它似乎不适用于 ROOT。它编译得很好,但是当我执行时,这就是我得到的: *** Break *** segmentation violation
我有一个耦合方程组:流体静力学平衡方程、质量连续性方程和理想气体的状态方程。这些是,在数学语法中, \frac{dP}{dr}=-\rho*g, 其中 \rho 是密度,g 是重力加速度。 \frac
有人能告诉我,为什么它总是返回相同的“y”值吗?我在 Internet 上搜索了很多,但我仍然不知道为什么它不起作用。 using System; using System.Collections.G
下面是我用于求解一阶 ODE 的四阶 Runge-Kutta 算法。我正在根据找到的维基百科示例检查它 here解决: \frac{dx}{dt} = tan(x) + 1 不幸的是,它有点出局了。我
我正在尝试实现 Runge-Kutta Method for Systems of DEs在 MATLAB 中。我没有收到 correct answers ,我不确定代码或我用来运行它的命令是否有问题
尝试实现自适应步长 Runge-Kutta Cash-Karp 但失败并出现此错误: home/anaconda/lib/python3.6/site-packages/ipykernel_launc
我正在尝试编写一个函数,该函数将使用 4 阶隐式 Runge-Kutta 方法 (IRK) 求解 ODES 系统,但我无法正确定义循环。这里我们定义 IRK 任何建议将不胜感激! function [
Gaffer on Games 有一个 great article关于使用RK4 integration为了更好的游戏物理。实现很简单,但其背后的数学让我感到困惑。我在概念层面上了解导数和积分,但已经
这个公式主要是这个线程的结果:Differential Equations in Java . 基本上,我尝试遵循 Jason S. 的建议,并通过 Runge-Kutta 方法 (RK4) 实现微分
我是Python的新手,我对编程语言的了解还处于起步阶段,所以我复制了所示的Runge-Kutta Python脚本here并根据我的目的对其进行了修改。这是我当前的脚本: import numpy
我一直在将 4 个链接微分方程的欧拉方法实现转换为四阶龙格库塔实现。我相当确信我的一般方法是正确的,并且我已经了解如何应用 RK4,但我可能已经有 6 年没有做过任何半严肃的数学了,所以我可能会错过某
我尝试求解简单的数值方程 - 没有源的线性波动方程:utt = v2 uxx 其中 v - 波速。 我使用初始条件: u(x, 0) = sin(x) ux(x, 0) = -v * sin(x) 对
我的问题与 Runge-Kutta 4 (RK4) 方法和轨道卫星状态向量所需的正确迭代步骤有关。下面的代码(在 Python 中)根据此链接 (http://www.navipedia.net/in
我是一名优秀的程序员,十分优秀!