Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Interpolacja funkcja sklejana

Ostatnio zmodyfikowano 2017-05-30 19:16
Autor Wiadomość
KamilJB
Temat założony przez niniejszego użytkownika
Interpolacja funkcja sklejana
» 2017-05-30 12:36:47
C/C++
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <math.h>

using namespace std;

const int n = 5;
const int dn = 2;
const int rm = n + dn;
const double xt[ n ] = { - 4.0, - 2.0, 0.0, 2.0, 4.0 };
const double yt[ n ] = { 1155.0, 79.0, 3.0, 63.0, 931.0 };
const double dxt[ 2 ] = { - 4.0, 4.0 };
const double dyt[ 2 ] = { - 1124.0, 940.0 };
const double xv = 1.0;
const int dpos[] = { 0, 4 };

void rozwiaz_uklad_rownan( double macierz[ rm ][ rm + 1 ], double wynik[ rm ] )
{
    for( int i = 0; i < rm - 1; i++ )
    {
        for( int j = i + 1; j < rm; j++ )
        {
            double m = - macierz[ j ][ i ] / macierz[ i ][ i ];
            for( int k = i + 1; k <= rm; k++ )
            {
                macierz[ j ][ k ] += m * macierz[ i ][ k ];
            }
        }
    }
   
    for( int i = rm - 1; i >= 0; i-- )
    {
        double sp = macierz[ i ][ rm ];
        for( int j = rm - 1; j >= i + 1; j-- )
        {
            sp -= macierz[ i ][ j ] * wynik[ j ];
        }
        wynik[ i ] = sp / macierz[ i ][ i ];
    }
}

int main()
{
    double macierz[ rm ][ rm + 1 ];
   
    for( int i = 0; i < n; i++ )
    {
        for( int j = 0; j < n; j++ )
        {
            macierz[ i ][ j ] = powf( xt[ i ], j );
        }
       
        for( int j = 1;( n + j <= rm ) &&( j <= i ); j++ )
        {
            macierz[ i ][ n - 1 + j ] = pow( xt[ i ] - xt[ j ], 3.0 );
        }
    }
   
    for( int i = n; i < dn + n; i++ )
    {
        for( int j = 0; j < n; j++ )
        {
            macierz[ i ][ j ] = j * powf( xt[ dpos[ dpos[ i - n ] ], j - 1 );
        }
        for( int j = 1;( i + j <= rm + 1 ) &&( j < dpos[ i - n ] ); j++ )
        {
            macierz[ i ][ n + j - 1 ] = 3.0 * powf( xt[ dpos[ dpos[ i - n ] ] - xt[ j ], 2.0 );
        }
    }
   
    for( unsigned i = 0; i < n; i++ )
    {
        macierz[ i ][ rm ] = yt[ i ];
    }
   
    for( unsigned i = n; i < rm; i++ )
    {
        macierz[ i ][ rm ] = dyt[ i - n ];
    }
   
    for( unsigned y = 0; y < 7; y++ )
    {
        cout << "Macierz:" << endl;
        for( int x = 0; x < 8; x++ )
        {
            cout << macierz[ y ][ x ] << "\t";
        }
        cout << endl;
    }
   
    double wyniki[ 7 ];
   
    rozwiaz_uklad_rownan( macierz, wyniki );
   
    double w0 = wyniki[ 0 ];
    double w1 = wyniki[ 1 ];
    double w2 = wyniki[ 2 ];
    double w3 = wyniki[ 3 ];
    double w4 = wyniki[ 4 ];
    double w5 = wyniki[ 5 ];
    double w6 = wyniki[ 6 ];
   
    cout << "Wartosci zmiennych:" << endl;
    for( unsigned i = 0; i < 7; i++ )
    {
        cout << wyniki[ i ] << endl;
    }
   
    double wynik_koncowy = w0 + w1 * xv + w2 * powf( xv, 2 ) + w3 * powf( xv, 3 ) +
    w4 * powf( xv, 4 );
   
    cout << "Wynik f(" << xv << ") = "
    << wynik_koncowy << endl;
   
    while( 1 ) { }
   
    return 0;
}


Wielomian musi być zawsze 3 stopnia. Co trzeba w nim poprawić?[/i]
P-161787
Kinexity
» 2017-05-30 12:53:49
Wstaw kod w [*cpp][*/cpp] (bez gwiazdek)
P-161788
KamilJB
Temat założony przez niniejszego użytkownika
» 2017-05-30 13:00:01
Gotowe.
P-161789
pekfos
» 2017-05-30 14:02:31
A problem masz z..?
P-161791
KamilJB
Temat założony przez niniejszego użytkownika
» 2017-05-30 14:16:12
Program liczy dobrze.
Problem jest w tym, że moja Pani chce , żeby maksymalny wielomian był stopnia trzeciego a nie czwartego.
P-161793
KamilJB
Temat założony przez niniejszego użytkownika
» 2017-05-30 19:16:59
Ktoś coś poradzi ?
P-161813
« 1 »
  Strona 1 z 1