Dostałem zadanie na studiach napisania programiku zamieniający wielomian interpolacyjny, postaci [b]a0 + a1(x-x0) + a2(x-x0)(x-x1) + ... an(x-x0)(x-x1)(x-x2)...(x-x[n-1])[/b] na wielomian newtona - [b]bn*xn + b[n-1]x(n-1) + ... + b1x + b0[/b].
Udało mi się napisać programik dla wielomianów stopnia n=4, ale to za mało.
Moglibyście mi pomóc, z góry dziękuje wszystkim za jakiekolwiek wskazówki
Oto kod mojego dzieła:
#include <iostream> //biblioteka standartowa
#include <fstream> //biblioteka odpowiedzialna za zapis do pliku
//funkcje:
void alg (int, float [], float [], float []);
float iks (float [], int, int);
//funkcja glowna:
int main()
{
//funkcja zawiera ponizsze strumienie
using std::cout;
using std::endl;
using std::cin;
using std::ofstream;
//zmienna zapetlajaca program
bool jeszcze_raz = true;
//otwarcie pliku do zapisu
ofstream file("rozw.txt");
//zapetlenie programu
while (jeszcze_raz)
{
//wczytanie danych
cout << "Wielomian interpolacyjny: a0 + a1(x-x0) + a2(x-x0)(x-x1)+ "
<< "... + an(x-x0)...(x-xm)^ m=n1" << endl << endl;
float *x = NULL;
float *a = NULL;
float *w = NULL;
int n;
cout << "Podaj stopien wielomianu: ";
cin >> n;
a = new float[n+1];
x = new float[n];
cout << "Podaj a[0]: ";
cin >> a[0];
for (int i = 0; i < n; i++)
{
cout << "Podaj a[" << i+1 << "]: ";
cin >> a[i+1];
cout << "Podaj x[" << i << "]: ";
cin >> x[i];
x[i] = -x[i];
};
//koniec wczytywania
//zapis do pliku wielomianu interpolacyjnego
file << a[0];
for (int z = 1; z <= n; z++)
{
if (a[z] > 0)
file << "+";
if (a[z] == 1)
;
else
if (a[z] == -1)
file << "-";
else
file << a[z];
for (int c = 0; c < z; c++)
{
if (x[c] == 0)
file << "x";
else
{
file << "(x";
if (x[c] > 0)
file << "+";
file << x[c] << ")";
};
};
};
file << "=";
//koniec zapisu
//tablica w - nowa postac wielomianu
w = new float[n+1];
//algorytm
alg (n, w, a, x);
//zapis do pliku wielomianu klasycznego
file << w[n];
for (int z = n; z >= 1; z--)
{
if (z > 1)
{
file << "x^" << z << " ";
if (w[z-1] > 0)
file << "+";
file << w[z-1];
}
else
{
file << "x ";
if (w[z-1] > 0)
file << "+";
file << w[z-1] << endl;
};
};
//koniec zapisu
//petla ciag dalszy:
cout << "Czy kontynuowac dzialanie programu? (tak - 1; nie - 0) ";
cin >> jeszcze_raz;
}
//koniec petli
return 0;
};
void alg (int stopien, float w[], float a[], float x[])
{
for (int i = stopien; i >= 0; i--)
{
for (int j = i; j <= stopien; j++)
{
w[i] += (a[j] * iks(x, i, j));
};
};
return;
};
float iks(float x[], int i, int j)
{
if ( i == j)
return 1;
float X = 0.0;
for (int k = 0; k < j; k++)
{
float Y = 1.0;
for (int t = 0; t < j-i; t++)
Y *= x[k+t];
X += Y;
};
return X;
};