Подгонка кривой к трехмерному полиному с переменными степенями - PullRequest
5 голосов
/ 21 мая 2019

У меня есть 3 набора данных. 2 для самого полинома (назовем их x и y) и 1 для значения функции (это будет z).

Полином выглядит примерно так (при условии, что мощность обоих измерений равна 3):

z = a00 + a01*x + a02*x^2 + a03*x^3 + a10*y + a11*y*x + a12*y*x^2 ... etc

Мне нужно иметь возможность устанавливать мощность каждого измерения при подготовке к приближению значений «а».

Я не совсем понимаю, как функции CurveFitting работают с Math.NET Numerics, но я пробовал Fit.LinearMultiDim и MultipleRegression.QR. У меня проблемы с инициализацией делегата Func


    var zs = new double[]
    {
        //values here

    };

    var x = new double[]
    {
        //values here
    };

    var y = new double[]
    {
        //values here. But the amounts are equal
    };

    var design = Matrix<double>.Build.DenseOfRowArrays(Generate.Map2(x, y,(t, w) =>
    {
        var list = new List<double>();      //Can i get this working?
        for (int i = 0; i <= 3; i++)
        {
            for (int j = 0; j <= 3; j++)
            {
                list.Add(Math.Pow(t, j)*Math.Pow(w, i));
            }
        }
        return list.ToArray();
    }));

    double[] p = MultipleRegression.QR(design, Vector<double>.Build.Dense(zs)).ToArray();

Так что в идеале мне нужно иметь возможность составить функцию с каким-то циклом, который учитывает максимальную мощность обеих переменных.

UPD: функция всегда выше нуля на любой оси

1 Ответ

0 голосов
/ 28 мая 2019

Я думаю, у меня все получилось.

Вот код:

    List<Func<double[], double>> ps = new List<Func<double[],double>>();

                for (int i = 0; i <= polynomialOrderFirstVal; i++)
                {
                    for (int j = 0; j <= polynomialOrderSecVal; j++)
                    {
                        var orderFirst = j;
                        var orderSecond = i;
                        ps.Add(d => Math.Pow(d[0], orderFirst) * Math.Pow(d[1],orderSecond));
                    }
                }
                var psArr = ps.ToArray();
                double[] coefs = Fit.LinearMultiDim(x, y, psArr);
...