Untitled
unknown
plain_text
a year ago
4.5 kB
4
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