GrasshopperでMath.NET Numericsを使おう

C#

Math.NET Numericsとは

Math.NET Numerics とは.NET Framework用の数値計算ライブラリです。Grasshopperでコンポーネントを作る人は何かしらのシミュレーションや計算を行うことがあるかと思います。例えば構造解析では大規模な連立方程式を解く必要があります。

そういった時の対処法として

  • フルスクラッチでソルバーを書く。
  • ライブラリを使う。
  • ほかの開発環境で作った計算プログラムをGrasshopperから呼び出す

ということが考えられます。この記事は2番目のライブラリを使う場合について説明します。

手順としてはこんな感じ

  1. 公式サイトにいってdllファイルをダウンロード
  2. Grasshopperを開き、C#かVBコンポーネントを使って
    1. 右クリック->ManageAssemblies->Addよりダウンロードしたdllファイルを選択
  3. C#かVBのコードを書く

例えば,次のような式を解く場合はこんな感じでプログラムを書けばOKです。

(1)   \begin{equation*}\begin{bmatrix} 2.0 & 3.0 \\ 4.0 & 5.0 \end{bmatrix}\begin{Bmatrix} x \\ y \end{Bmatrix} =\begin{Bmatrix} 8.0 \\ 14.0 \end{Bmatrix}\end{equation*}

using System;
using System.Collections;
using System.Collections.Generic;

using Rhino;
using Rhino.Geometry;

using Grasshopper;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Data;
using Grasshopper.Kernel.Types;

using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra;

/// <summary>
/// This class will be instantiated on demand by the Script component.
/// </summary>
public class Script_Instance : GH_ScriptInstance
{
  /// <summary>
  /// This procedure contains the user code. Input parameters are provided as regular arguments,
  /// Output parameters as ref arguments. You don't have to assign output parameters,
  /// they will have a default value.
  /// </summary>
  private void RunScript(ref object A)
  {
    double[,] a = new double[2, 2];
    a[0, 0] = 2.0;
    a[0, 1] = 3.0;
    a[1, 0] = 4.0;
    a[1, 1] = 5.0;
    double[] b = new double[2];
    b[0] = 8.0;
    b[1] = 14.0;
    Matrix<double> Amat = DenseMatrix.OfArray(a);
    Vector<double> Bvec = DenseVector.OfArray(b);
    var x = Amat.Solve(Bvec);
    string result = "x = " + x[0].ToString() + " ," + x[1].ToString();
    A = result;
  }
}

計算結果はこんな感じ。

もちろんガウスの消去法や、逆行列を使ってもOKな問題ですが。とても使いやすいライブラリなのでぜひお試しあれ!

コメント

タイトルとURLをコピーしました