Как сделать этот алгоритм построения графиков более эффективным? - PullRequest
0 голосов
/ 27 сентября 2019

Я написал некоторый код на C # для отображения точек данных, сгенерированных большим полиномиальным уравнением, например:

y = (a*b*c*… + e*d*f*g *…*x + h*…*x*x +...)/(A*B*C*… + E*D*F*G*…*x +...)

, где a, b, c,... F, G - известные коэффициенты с плавающей точкой, а x - переменная * 1006.*

Я сохранил уравнение с помощью числителя Arraylist of Arraylists и знаменателя Arraylist of Arraylists (сумма произведений, где каждый массив в числителе и знаменателе представляет собой набор либо коэффициентов с плавающей точкой, либо строки «x», которые находятся в процессеумножается вместе, и каждый результат суммируется)

Затем я делаю циклы через все Arraylists в числителе и перебираю каждый коэффициент или переменную строку в каждом из них и умножаю все для каждого (подставляя текущую точку данныхдля строки "x") и добавьте каждый результат к окончательному результату числителя.Я повторяю то же самое для знаменателя.Затем я делю два для каждой точки данных.

Существует ли более эффективный алгоритм для расчета этих точек данных?Моя цель состоит в том, чтобы иметь ползунок, который пользователь может скользить и в режиме реального времени видеть, как изменение любого из коэффициентов изменит график полинома.

Правка, я думаю, что некоторые способы ускорить ее - переместить эту строку

float temp_y = helper_get_num_denom_total(start_x + del_x * i,  numer)/helper_get_num_denom_total(start_x + del_x*i, denom);

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

Правка, часть кода, даже если он немного грязный (надеюсь, я все понял):

    float del_x = Mathf.Abs(end_x - start_x) / num_points;
    //float del_y = Mathf.Abs(end_y - start_y) / num_points;

    float start_x_log = Mathf.Log(start_x, 10);
    /////////////////float del_x_log = Mathf.Log(Mathf.Abs(end_x - start_x), 10) / num_points;
    float del_x_log = Mathf.Abs((Mathf.Log(end_x, 10) - start_x_log)) / num_points; 
    Debug.Log("x log    end_x is: " + end_x + "  while start_x is: " + start_x);
    Debug.Log("start x log is: " + start_x_log + "del x log is: " + del_x_log);


    float[] points_x = new float[num_points];
    float[] points_y = new float[num_points]; 


    for (int i = 0; i<num_points; i++) {
        // substitute each value into 
        float temp_y = helper_get_num_denom_total(start_x + del_x * i, numer)/helper_get_num_denom_total(start_x + del_x*i, denom);

        if (logrithmic == true) {

            points_x[i] = start_x_log + del_x_log * i;
            points_y[i] = 20f*Mathf.Log(helper_get_num_denom_total(Mathf.Pow(10, points_x[i]), numer) / helper_get_num_denom_total(Mathf.Pow(10, points_x[i]), denom), 10);
            Debug.Log("inside processing, new x-y is: (" + points_x[i] + ", " + points_y[i] + ")");
        }
        else {
            ////////////////////points_y[i] = temp_y;
            points_x[i] = start_x + del_x * i;
            points_y[i] = temp_y;
            Debug.Log("current temp_y is: " + temp_y);
        }
    }


 /// and this method


public float helper_get_num_denom_total(float point_x, ArrayList   num_or_denom) {
    float total = 0; 
    for (int i = 0; i<num_or_denom.Count; i++) {
        ArrayList temp_arraylist;
        temp_arraylist = (ArrayList)num_or_denom[i];
        float temp_total = 1f;
        if (temp_arraylist.Count>0) {
            for (int j = 0; j < temp_arraylist.Count; j++) {
                string temp_string = temp_arraylist[j].ToString();
                float convert = 1;
                bool is_num = float.TryParse(temp_string, out convert);
                if (is_num == true) {
                    temp_total = temp_total * convert;
                }
                else if (string.Equals(temp_string, "x")) {
                    //Debug.Log("inside helper get num denom total, S else if triggered");
                    temp_total = temp_total * point_x;
                }
            }
        }
        else {
            temp_total = 0f; 
        }
        total = total + temp_total;
        Debug.Log("inside helper get num denom total, total is: " + total);
    }
    total = Mathf.Abs(total);
    return total; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...