2.9.1 Eigen

WWWサイトから、Stable Release (2022/10/17現在、version 3.4.0) のファイルを取ってきて、 インストールするのは簡単である。

eigen-3.4.0/INSTALL というファイルを読むと、 二つの方法が書かれている。

方法1は単純で、マニュアルでコピーする感じ。 eigen-3.4.0/Eigen というディレクトリィをどこか適当な場所 (インクルード・ファイルを置くことにしてあるディレクトリィ) にコピーする、というものである。 私はその手のディレクトリィは、 通常 /usr/local/include にコピーすることにしているにしているので、 それを踏襲すると次のようになる。
方法1: ターミナルで実行
curl -O https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
tar xzf eigen-3.4.0.tar.gz
cd eigen-3.4.0
sudo mkdir -p /usr/local/include
sudo cp	-pr Eigen /usr/local/include
(注: 古いバージョンをインストールしていた場合は、 それをどけておいてからコピーするとか考える。)

こうしてインストールした場合はコンパイル時に、 -I /usr/local/include というオプションを使うことになる。


方法2は cmake を使うものである。

方法2: ターミナルで実行
curl -O https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
tar xzf eigen-3.4.0.tar.gz
mkdir eigen-build
cd eigen-build
cmake ../eigen-3.4.0
sudo make install
こうすると /usr/local/include/eigen3/Eigen にインストールされる。 コンパイル時に -I /usr/local/include/eigen3 というオプションを使うことになる。


ball.cpp

/*
 * ball.cpp --- はねるボール
 *   http://nalab.mind.meiji.ac.jp/~mk/program/ode_prog/ball.cpp
 *   cc -I /usr/local/include ball.cpp
 *   ./a.out > ball.data
 *   gnuplot で	plot "ball.data" with lp
 */

#include <iostream>
#include <math.h>
#include <Eigen/Dense>
using namespace Eigen;

double m, g, Gamma, e;

VectorXd f(double t, VectorXd x)
{
  VectorXd y(4);
  y(0) = x(2);
  y(1) = x(3);
  y(2) = - Gamma / m * x(2);
  y(3) = - g - Gamma / m * x(3);
  return y;
}

int main(void)
{
  int n, N;
  double tau, Tmax, t,pi;
  VectorXd x(4),k1(4),k2(4),k3(4),k4(4);

  pi = 4 * atan(1.0);
  m = 100;
  g = 9.8;
  Gamma = 1.0;
  e = 1.0;

  Tmax = 20;
  N = 1000;
  tau = Tmax / N;
  x << 0,0,50*cos(pi*50/180),50*sin(pi*50/180);
  for (n = 0; n < N; n++) {
    t = n * tau;
    k1 = tau * f(t, x);
    k2 = tau * f(t+tau/2, x+k1/2);
    k3 = tau * f(t+tau/2, x+k2/2);
    k4 = tau * f(t+tau, x+k3);
    x = x + (k1 + 2 * k2 + 2 * k3 + k4) / 6;
    if (x(1)<0) {
      x(1) = - x(1);
      x(3) = - x(3);
    }
    std::cout << x(0) << " " << x(1) << std::endl;
  }
}

入手して実行する
curl -O https://m-katsurada.sakura.ne.jp/program/ode_prog/ball.cpp
c++ -I/usr/local/include -o ball ball.cpp
./ball > ball.data
gnuplot
gnuplot が起動して gnuplot> というプロンプトが表示される。
gnuplot> plot "ball.data" with lp
これでボールの軌跡が描かれる。以下は画像ファイルへの保存。
gnuplot> set term png
gnuplot> set output "ball.png"
gnuplot> replot
gnuplot> quit

図 1: はずむボール, 空気抵抗あり, 完全弾性衝突
Image ball



桂田 祐史