Untitled

 avatar
unknown
plain_text
5 months ago
4.5 kB
3
Indexable
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // Przykładowe punkty węzłowe
        var wezly = new List<(double x, double y)>
        {
            (0, 1), (1, 2), (2, 2), (4, 3)
        };

        Console.WriteLine("Punkty węzłowe:");
        foreach (var wezel in wezly)
            Console.WriteLine($"(x: {wezel.x}, y: {wezel.y})");

        Console.WriteLine("\n--- Metoda Lagrange'a ---");
        string wielomianLagrangea = MetodaLagrangea(wezly);
        Console.WriteLine($"\nWielomian interpolacyjny (uproszczony): {wielomianLagrangea}");

        Console.WriteLine("\n--- Metoda Newtona ---");
        string wielomianNewtona = MetodaNewtona(wezly);
        Console.WriteLine($"\nWielomian interpolacyjny (uproszczony): {wielomianNewtona}");
        Console.ReadKey();
    }

    static string MetodaLagrangea(List<(double x, double y)> wezly)
    {
        int liczbaWezlow = wezly.Count;
        double[] wspolczynniki = new double[wezly.Count];

        for (int i = 0; i < liczbaWezlow; i++)
        {
            double[] skladnik = { 1.0 };
            double mianownik = 1.0;

            for (int j = 0; j < liczbaWezlow; j++)
            {
                if (i != j)
                {
                    skladnik = MnozWielomiany(skladnik, new double[] { -wezly[j].x, 1 });
                    mianownik *= (wezly[i].x - wezly[j].x);
                }
            }

            for (int k = 0; k < skladnik.Length; k++)
                skladnik[k] *= wezly[i].y / mianownik;

            wspolczynniki = DodajWielomiany(wspolczynniki, skladnik);
        }

        return WielomianNaString(wspolczynniki);
    }

    static string MetodaNewtona(List<(double x, double y)> wezly)
    {
        int liczbaWezlow = wezly.Count;
        double[,] ilorazyRoznicowe = new double[liczbaWezlow, liczbaWezlow];

        for (int i = 0; i < liczbaWezlow; i++)
            ilorazyRoznicowe[i, 0] = wezly[i].y;

        for (int j = 1; j < liczbaWezlow; j++)
        {
            for (int i = 0; i < liczbaWezlow - j; i++)
            {
                ilorazyRoznicowe[i, j] =
                    (ilorazyRoznicowe[i + 1, j - 1] - ilorazyRoznicowe[i, j - 1]) /
                    (wezly[i + j].x - wezly[i].x);
            }
        }

        double[] wspolczynniki = { ilorazyRoznicowe[0, 0] };

        for (int i = 1; i < liczbaWezlow; i++)
        {
            double[] skladnik = { 1.0 };

            for (int j = 0; j < i; j++)
            {
                skladnik = MnozWielomiany(skladnik, new double[] { -wezly[j].x, 1 });
            }

            for (int k = 0; k < skladnik.Length; k++)
                skladnik[k] *= ilorazyRoznicowe[0, i];

            wspolczynniki = DodajWielomiany(wspolczynniki, skladnik);
        }

        return WielomianNaString(wspolczynniki);
    }

    static double[] MnozWielomiany(double[] wiel1, double[] wiel2)
    {
        double[] wynik = new double[wiel1.Length + wiel2.Length - 1];

        for (int i = 0; i < wiel1.Length; i++)
        {
            for (int j = 0; j < wiel2.Length; j++)
            {
                wynik[i + j] += wiel1[i] * wiel2[j];
            }
        }

        return wynik;
    }

    static double[] DodajWielomiany(double[] wiel1, double[] wiel2)
    {
        int dlugosc = Math.Max(wiel1.Length, wiel2.Length);
        double[] wynik = new double[dlugosc];

        for (int i = 0; i < dlugosc; i++)
        {
            double wsp1 = i < wiel1.Length ? wiel1[i] : 0;
            double wsp2 = i < wiel2.Length ? wiel2[i] : 0;
            wynik[i] = wsp1 + wsp2;
        }

        return wynik;
    }

    static string WielomianNaString(double[] wspolczynniki)
    {
        var skladniki = new List<string>();

        for (int i = wspolczynniki.Length - 1; i >= 0; i--)
        {
            if (Math.Abs(wspolczynniki[i]) > 1e-10)
            {
                string czesc = wspolczynniki[i].ToString("F2");
                if (i > 0)
                {
                    czesc += "x";
                    if (i > 1)
                        czesc += $"^{i}";
                }
                skladniki.Add(czesc);
            }
        }

        return string.Join(" + ", skladniki);
    }
}
Editor is loading...
Leave a Comment