Я написал некоторый код на 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;
}