簡體   English   中英

C#從圖表中饋送具有x和y值的方法(多項式計算)

[英]c# feed a method with x and y values from a chart (polynomial calculation)

我有這種方法來獲得我想要的次數的多項式:

public static double[] Polyfit(double[] x, double[] y, int degree)
{
    // Vandermonde matrix
    var v = new DenseMatrix(x.Length, degree + 1);
    for (int i = 0; i < v.RowCount; i++)
        for (int j = 0; j <= degree; j++) v[i, j] = Math.Pow(x[i], j);
    var yv = new DenseVector(y).ToColumnMatrix();
    QR qr = v.QR();
    // Math.Net doesn't have an "economy" QR, so:
    // cut R short to square upper triangle, then recompute Q
    var r = qr.R.SubMatrix(0, degree + 1, 0, degree + 1);
    var q = v.Multiply(r.Inverse());
    var p = r.Inverse().Multiply(q.TransposeThisAndMultiply(yv));
    Console.WriteLine(p.Column(0).ToString());
    return p.Column(0).ToArray();

}

如何將圖表中的值(x和y)用於上述方法?

chart.Series[0].Points.... ?

我認為您需要這樣做:

chart1.Series[0].YValueMembers
chart1.Series[0].XValueMember

Points屬性是一個吸氣劑,因此無法為其設置DataPointCollection的新實例。 但是,您應該能夠訪問當前DataPointCollection上的方法。

您可以嘗試以下方法:

chart.Series[0].Points.AddXY(double, double)

然后,您將迭代數組並手動設置點。

有關更多信息,請參見MSDN DataPointCollection

一個有效的解決方案是:

    ////generate polynomial of degree 4 fiting to the points
    double[] arrayX = new double[chart.Series[0].Points.Count()];
    double[] arrayY = new double[chart.Series[0].Points.Count()];
    double[] arrayResult = { };

    for (int i = 0; i < chart.Series[0].Points.Count(); i++)
    {
        arrayX[i] = chart.Series[0].Points[i].XValue; 
        arrayY[i] = chart.Series[0].Points[i].YValues[0];
    }

    arrayResult = Polyfit(arrayX, arrayY, 4);

    foreach (double element in arrayResult)
    {
       MessageBox.Show(element.ToString());
    }

    double functionVarE = arrayResult[0];
    double functionVarD = arrayResult[1];
    double functionVarC = arrayResult[2];
    double functionVarB = arrayResult[3];
    double functionVarA = arrayResult[4];
    double equationVar = 0;

    //prepare the function series in the graph
    if (chart.Series.IndexOf("function") < 0)
        chart.Series.Add("function");
    chart.Series[2].Points.Clear();
    chart.Series[2].ChartType = SeriesChartType.Line;

    for (int x = -500; x < 1000; x++)  //hardcoding
    {
        equationVar = functionVarA * (Math.Pow(x, 4)) + functionVarB * (Math.Pow(x, 3)) + functionVarC * (Math.Pow(x, 2)) + functionVarD * x + functionVarE;
        chart.Series[2].Points.AddXY(Convert.ToDouble(x), equationVar);
    }

這是我編寫的有效解決方案。 如果您看到任何改進,請隨時告訴我!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM