c#使用图表中的x和y值输入方法(多项式计算)

c#使用图表中的x和y值输入方法(多项式计算),c#,charts,polynomial-math,C#,Charts,Polynomial Math,我用这个方法得到了一个多项式,它的阶数是我想要的: 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 <= de

我用这个方法得到了一个多项式,它的阶数是我想要的:

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();

}

我想你需要这个:

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

Points
属性是一个getter,因此不能为其设置
DataPointCollection
的新实例。但是,您应该能够访问当前
DataPointCollection
上的方法

您可以尝试以下方法:

chart.Series[0].Points.AddXY(double, double)
然后迭代数组并手动设置点

更多信息。

工作解决方案是:

    ////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);
    }
///生成适合点的4次多项式
double[]arrayX=新的double[chart.Series[0].Points.Count()];
double[]arrayY=新的double[chart.Series[0].Points.Count()];
double[]arrayResult={};
对于(int i=0;i

这是我编写的有效解决方案。如果您看到任何改进,请随时告诉我

那不行方法需要double[]而不是strings@kiliv很抱歉,我从我的一个应用程序中复制粘贴的内容,但忘记删除它,请立即检查。实际上,这是chart1.Series[0]。YValue成员是get:set属性,我以前也设置过。这仍然是字符串,而不是双数组。只需通过字符串数组循环并将其解析为双数组。
    ////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);
    }