Untitled
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