5

私は2つの曲線を比較するプログラムに取り組んでいます(ダイオード出力に起因するため、その電圧/電流曲線)。

この 2 つの曲線の間の面積を計算したいと思います (青色の曲線は最初のダイオードで、赤色の曲線は 2 番目のダイオードです)。

ここに画像の説明を入力

各曲線には 51 個のデータ ポイントがあります (常に同じ量のデータ ポイントがあります)。私が現時点でやっていることは次のようなものです:

public double CalculateArea(double[,] pin1, double[,] pin2)
{
    double voltageArea = 0;
    double currentArea = 0; //Current (Vertical axis) not yet!
    double max = 0;
    double min = 0;

    for (int i = 0; i < pin1.GetLength(0); i++)
    {
        max = Math.Max(Math.Abs(pin1[i, 0]), Math.Abs(pin2[i, 0]));
        min = Math.Min(Math.Abs(pin1[i, 0]), Math.Abs(pin2[i, 0]));

        voltageArea += max - min;
    }

    return voltageArea;
}

このコードは、Current (縦軸) で何もしないことを念頭に置いて、何とか機能します。結果が 0.05 などの 0 に近い場合、曲線間の差は無視できます。しかし、これは正しい方法ではないと確信しています。私が書いた方法の結果がどうなるかまったくわかりません...電圧ポイントのみの違いのようです。

この方法の改善にご協力いただければ幸いです。

4

1 に答える 1

3

まず、一方のダイオードを他方から差し引きます。値の差が得られます。次に、区分線形関数の下の面積を考慮する台形則を使用します。

class Program
{
    /// <summary>
    /// Calculate integral with trapezoidal rule
    /// </summary>
    /// <param name="h">The step size in x-axis</param>
    /// <param name="y">The array of values to integrate</param>
    /// <returns>The area under the curve y[i,0]</returns>
    public static double Integrate(double h, double[,] y)
    {
        int N=y.GetLength(0);

        double sum=(y[0, 0]+y[N-1, 0])/2;

        for(int i=1; i<N-1; i++)
        {
            sum+=y[i, 0];
        }

        return h*sum;
    }

    static void Main(string[] args)
    {
        int N = 100;
        double[,] y=new double[N, 1];

        for(int i=0; i<y.GetLength(0); i++)
        {
            y[i, 0]=5+5*Math.Sin(2*Math.PI*i/(N-1));
        }

        double x_min=0.5;
        double x_max=3.5;
        double h = (x_max-x_min)/N;

        double area=Integrate(h, y);
        // expected answer is   area = 15.00
        // actual answer is     area = 14.85
    }
}
于 2012-07-02T13:19:17.480 に答える