Vstupné parametre programu sú polia, ktorých prvky predstavujú body v xy rovine, ktoré chceme aproximovať mocninovou funkciou. Výstupne parametre sú požadované koeficienty rovnice (aproximácie).
Pre zaujímavosť aj trošku teórie:
Mocnimová aproximácia: y = bxa
Úprava rovnice y = bxa do logaritmického tvaru:
Sústava 2 rovníc o 2 neznámych. V rovniciach je použitá substitúcia B = lnb.
Riešením je:
kde B = lnb.
Zdrojový kód:
public bool powerApproximation(out string errorMessage, double[] xArray, double[] yArray, out double bValue, out double aValue) { errorMessage = ""; aValue = 0; bValue = 0; try { //kontrola dlzky jednotlivych poli, x, y hodnoty if (xArray.Length != yArray.Length) { errorMessage = "Error: different lenght of arrays."; return false; } int n = xArray.Length; //dlzka pola, pocet bodov pouzitych pri aproximacii if (n == 0) { errorMessage = "Error: array is empty."; return false; } // inicializacia premennych double num1a = 0; double num2a = 0; double num3a = 0; double den1a = 0; double den2a = 0; double num1b = 0; double num2b = 0; // vypocet jednotlivych prvkov (sum) v rovniciach for (int i = 0; i < n; i++) { if (xArray[i] > 0 && yArray[i] > 0) { num1a += Math.Log(xArray[i], Math.E) * Math.Log(yArray[i], Math.E); num2a += Math.Log(xArray[i], Math.E); num3a += Math.Log(yArray[i], Math.E); den1a += Math.Pow(Math.Log(xArray[i], Math.E), 2); } else { errorMessage = "Error: invalid input for function ln(value), value must be greater than zero."; return false; } } den2a = Math.Pow(num2a, 2); num1b = num3a; num2b = num2a; // kontrola menovatelov, nemozu byt nulove - delenie nulou if (n == 0 || (den1a - den2a) == 0) { errorMessage = "Error: divide by zero."; return false; } // vypocet koeficientov aValue = (n * num1a - num2a * num3a) / (n * den1a - den2a); bValue = Math.Exp((num1b - aValue * num2b) / n); } catch (Exception ex) { errorMessage = ex.Message; return false; } return true; }