streda, 30 máj 2012 09:52 Written by 4664 times
Rate this item
(6 votes)

C# - Mocninová aproximácia

Mocninová aproximácia je jednoduchým príkladom ako využiť matematické funkcie v C#.

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:

MA1

 Sústava 2 rovníc o 2 neznámych. V rovniciach je použitá substitúcia B = lnb.

MA2

Riešením je:

MA3

kde B = lnb.

Vzor graf

 

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;
        }
Last modified on pondelok, 19 december 2016 21:25
Ing.Peter Šuba

Zakladateľ www.projectik.eu

It's time for another revolution

(Why so serious?)

Website: www.projectik.eu