Προς το περιεχόμενο

Πώς να κρατήσω τις τιμές του κάθε συντελεστή lagrange .c++


ggeo1

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

 

Λοιπόν , προσπαθώ σε c++ να βρω τους συντελεστές lagrange.

 

Η άσκηση λέει "Find Lagrange's polynomial approximation for y(x)=cos(π x), x ∈−1,1 using 5 points (x = -1, -0.5, 0, 0.5, and 1)."

 

Αυτό που προσπαθώ να πετύχω και δεν μπορώ (διότι κάτι λάθος κάνω μάλλον) είναι το εξής:

 

Στον pointer d θέλω να κρατώ τις τιμές του πολυωνύμου για κάθε συντελεστή lagrange.

Για παράδειγμα , για τον συντελεστή L1(x) ,το d[0] θα είναι "x-x2/x1-x2" ,d[1] θα είναι (x-x2/x1-x2)*(x-x3/x1-x3) κτ

 

(Επισυνάπτω και τη λύση της άσκησης με το χέρι.)

 

Επίσης , τα προβλήματά μου είναι :

 

1) πώς θα αρχικοποιήσω την d (έχω κάνει d[0]=(z-x)/(x[k]-x) αλλά νομίζω ότι δεν είναι σωστό το "d[0]"

 

2) πώς θα αρχικοποιήσω το L_coeff. ( χρησιμοποιώ L_coeff=new double[0] αλλά δεν ξέρω αν είναι σωστό.

 

Ο κώδικας :

 

 

>#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>

using namespace std;

const double pi=3.14159265358979323846264338327950288;

// my function
double f(double x){

return (cos(pi*x));

}


//function to compute lagrange polynomial
double lagrange_polynomial(int N,double *x){
//N = degree of polynomial

double z,y;
double *L_coeff=new double [0];//L_coefficients of every Lagrange L_coefficient
double *d;//hold the polynomials values for every Lagrange coefficient
int k,i;
//computations for finding lagrange polynomial
//double sum=0;

for (k=0;k<N+1;k++){
       for ( i=0;i<N+1;i++){
           if (i==0) continue;
           d[0]=(z-x[i])/(x[k]-x[i]);//initialization
           if (i==k) L_coeff[k]=1.0;
           else if (i!=k){
           L_coeff[k]*=d[i];

                     }

          }

cout <<"\nL("<<k<<") = "<<d[i]<<"\t\t\tf(x)= "<<f(x[k])<<endl;
}

}

int main()
{

   double deg,result;
   double *x;


   cout <<"Give the degree of the polynomial :"<<endl;
   cin >>deg;

   for (int i=0;i<deg+1;i++){
   cout <<"\nGive the points of interpolation : "<<endl;
   cin >> x[i];
   }

   cout <<"\nThe Lagrange L_coefficients are: "<<endl;
   result=lagrange_polynomial(deg,x);



   return 0;
}

 

Eπίσης, εδώ έχει μια λύση αλλά δεν την πολυκαταλαβαίνω.

 

(καλοκαιριάτικα τώρα Lagrange,τι μας λες .. :rolleyes: )

Δημοσ.

Εδώ που είμαι τώρα δεν μπορώ να δώσω πλήρη απάντηση.

 

Δες το παρακάτω απόσπασμα κώδικα. Θα πάρεις μιαν ιδέα πώς να διορθώσεις το δικό σου.

(Τα παρακάτω τα γράφω απ έξω - ελπίζω να μην έχω λάθος...)

 

>
nPt : πλήθος δοθέντων σημείων (0 ως n)
ipt : πίνακας με τις συντεταγμένες (x,y) των σημείων αυτών. Τα σημεία αυτά χρησιμοποιούνται για την εύρεση των συντελεστών.
h   :  βήμα μεταξύ των δοθέντων σημείων (θεωρούνται ισαπέχοντα)

m  : πλήθος σημείων όπου ζητούνται οι τιμές με παρεμβολή (0 ως m)
pt : πίνακας με τις συντεταγμένες (x,y) των σημείων στα οποία ζητουνται οι τιμές με παρεμβολή
Οι τιμές pt.x δίνονται. Σε αυτές τις θέσεις θα βρεθούν οι pt.y με παρεμβολή.


typedef struct
{
  double x,y;
} PT;

PT *pt,*ipt;



int i,j,k;
double L, h=(ipt[nPt-1].x-ipt[0].x)/m;
pt[0].x=ipt[0].x;
pt[0].y=ipt[0].y;
for (i=0;i<=m;i++) 
{
  pt[i].y=0;
  for (j=0;j<=nPt-1;j++) 
  {
     L=1;
     for (k=0;k<=nPt-1;k++)
     if (j!=k)
        L *= (pt[i].x-ipt[k].x)/(ipt[j].x-ipt[k].x);
        pt[i].y += ipt[j].y*L;
  }
  if (i<m)
  pt[i+1].x=pt[i].x+h;
}

Η παρεμβολή με το πολυώνυμο Langrange έχει κάποια μειονεκτήματα.

Στην πράξη, όταν χρειάζεται πολυωνυμική παρεμβολή, εφαρμόζεται ο αλγόριθμος Neville's...

 

Tέλος, το πλήθος των συντελεστών είναι όσο αυτό των δοθέντων σημείων, δηλ n,

συνεπώς το L_coeff=new double[0] που γράφεις είναι λάθος....

 

-

Δημοσ.

Καταρχήν , ευχαριστώ πολύ για την απάντηση!

 

Δεν προλαβαίνω να το κοιτάξω πολύ ,θα το δω αύριο πιο λεπτομερώς μπας και βγάλω άκρη.

 

Απλά,θα με βοηθούσε να μπορέσω να το υλοποιήσω όπως το έχω στο μυαλό μου (δηλ να μπορώ κάπως να αποθηκεύω και έπειτα να εκτυπώνω τον κάθε πολυωνυμικό όρο (κάθε κλάσμα όπως λέω και παραπάνω) που βρίσκεται σε κάθε έναν συντελεστή lagrange)για να μάθω , τον τρόπο.

 

Ευχαριστώ και πάλι για το χρόνο σου.

Δημοσ.

Δυστυχώς , δε βγάζω άκρη!Με παιδεύει πολύ!Δεν μπορώ να χειριστώ τον κάθε όρο από κάθε έναν συντελεστή Lagrange.

 

Έκανα κάποιες αλλαγές.

Έβαλα τον όρο term ως pointer για να κρατά τον τις τιμές του πολυωνύμου για κάθε συντελεστή lagrange.

Για παράδειγμα , για τον συντελεστή L1(x) ,το term[0] θα είναι "x-x2/x1-x2" ,term[1] θα είναι (x-x2/x1-x2)*(x-x3/x1-x3) κτλ

 

Kαι τον συντλεστή Lagrange τον χρησιμοποιώ ως double.

 

Τρέχοντας το πρόγραμμα μου εμφανίζει :

 

Give the degree of the polynomial :

4

 

Give the points of interpolation :

-1

 

Give the points of interpolation :

-0.5

 

Give the points of interpolation :

0

 

Give the points of interpolation :

0.5

 

Give the points of interpolation :

1

 

The Lagrange coefficients are:

 

L(0) = 0.5 f(x)= -1

 

L(1) = 0.666667 f(x)= 4.63268e-05

 

L(2) = 1 f(x)= 1

 

L(3) = 2 f(x)= 4.63268e-05

 

L(4) = -1 f(x)= -1

 

 

1) Δεν μου εμφανίζει για κάθε συντελεστή Lagrange 5 όρους(το term) όπως θα έπρεπε αλλά μόνο έναν.

2) Φυσικά είναι λάθος τα αποτελέσματα!

3) Εντάξει,δεν έχω ασχοληθεί για να φαίνεται με σωστή μορφή π.χ L(0)=0.67x^4-0.67x^3-0.17x^2+0.17x+0 αλλά αυτό αργότερα!

 

 

 

>double lagrange_polynomial(int N,double *x){
//N = degree of polynomial

double z;
//double *L_coeff=new double [N];//L_coefficients of every Lagrange L_coefficient
double *term=new double [N];//hold the polynomials values for every Lagrange coefficient
double L_coeff;
int k,i;
//computations for finding lagrange polynomial

for (k=0;k<N+1;k++){
       for ( i=0;i<N+1;i++){
           if (i==0) continue;
           if (i==k) L_coeff=1.0;
           else if (i!=k){
           term[k]=(z-x[i])/(x[k]-x[i]);
           L_coeff*=term[k];
                     }
          }

cout <<"\nL("<<k<<") = "<<term[k]<<"\t\t\tf(x)= "<<f(x[k])<<endl;
}

}

Δημοσ.

Nα κάτι πιο κοντα σε αυτό που θέλεις.

 

Έστω ότι δίνονται τα n+1 σημεία (xv,yv) και ένα σημείο x όπου όπου ζητείται να γίνει παρεμβολή.

Η ρουτίνα lagrange_polynomial, επιστρέφει τον πίνακα li ο οποίος περιέχει τις τιμές των συντελεστών langrange για

τα (xv,yv) στο σημείο x . Επίσης επιστρέφει την τιμή y της παρεμβολής στο x.

 

>#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <cmath> 

using namespace std; 

const double Pi=4.*atan(1.); 

// my function 
double f(double x){ 

return cos(Pi*x); 

} 


//function to compute lagrange polynomial 
double lagrange_polynomial(int n, double x, double *xv, double *yv, double *li)
{ 

int i,j;
double y, xi, denom;
double eps= 10E-9;

y=0.;
for (i=0; i<n; i++) {
  li[i]=1.;
  xi=xv[i];
  for (j=0; j<n; j++) {
     if (j != i) {
        denom = xi-xv[j];

        if (fabs(denom)<eps) {
           cout << "error : coincident nodes. Aborting...";
           exit(1);
        }

        li[i] *= (x-xv[j])/denom;
     }
  }
  y += yv[i]*li[i];
} 

return y;
}



int main() 
{ 

   int deg; 
   double x, result;


   cout <<"Give the degree of the polynomial : "; 
   cin >> deg; 
   double *xv=new double[deg+1];
   double *yv=new double[deg+1]; 
   double *li=new double[deg+1]; 

   cout <<"\nGive the known values x y : " << endl; 
   for (int i=0;i<deg+1;i++){
     cout << "\n" << i << " :\n"
          << "  x = "; cin >> xv[i]; 
     cout << "  y = "; cin >> yv[i]; 
   } 
   //double xv[]={2, 3, 4, 5};
   //double yv[]={.5, .333333, .25, .2};
   //double li[4];
   //deg=3;

   cout <<"\nGive a x to interpolate : "; 
   cin >> x; 

   result = lagrange_polynomial(deg+1, x, xv, yv, li); 

   cout << "\nThe interpolated value at  at x = " << x << " is " << result << endl;

   cout << "\nThe Langrange coefficients for the given points are :" << endl;
   for (int i=0;i<deg+1;i++)
      cout <<"L(" << xv[i] << ") = " << li[i] << endl ;

   cout << endl ;

   return 0; 
}

 

 

Οι συντελεστές langrange εξαρτώνται από το σημείο όπου ζητείται η παρεμβολή.

To να βρεις τους μεμονωμένους όρους για καθέναν απο αυτούς που τον απαρτίζουν ως πολυώνυμο γίνεται επισης αλλά δεν έχει νόημα διότι δεν χρειάζονται πουθενά.

Νόημα θα είχε να βρεθεί η μορφή του παρεμβολικού πολυωνύμου για τα δεδομένα σημεία (xv,yv).

 

-

Δημοσ.

Καλησπέρα!

 

Καταρχήν ευχαριστώ πάρα πολύ!Να σαι καλά για τη βοήθεια!

 

 

1) Δεν καταλαβαίνω γιατί ο κώδικας δεν δουλεύει σωστά να βάλεις "if (i==j) li=1.0;" αντί για li=1.0;

 

2)

To να βρεις τους μεμονωμένους όρους για καθέναν απο αυτούς που τον απαρτίζουν ως πολυώνυμο γίνεται επισης αλλά δεν έχει νόημα διότι δεν χρειάζονται πουθενά.

 

Αυτό είναι που ήθελα να κάνω εξαρχής (άσχετα αν έχει νόημα,το κάνω για να μπορέσω να μάθω πώς μπορεί να γίνει αυτό το πράγμα,να κρατάω δηλ τον κάθε όρο) και σπάω το κεφάλι μου ακόμη να το βρω.Γι αυτό έβαζα στον κωδικά μου τον όρο term αλλά φυσικά είναι λάθος.

Αν έχεις κάποιο tip γι αυτό θα με βοηθούσε πάρα πολύ...(χωρίς να κάτσεις δηλ να ασχοληθείς πάλι,αρκετά έκανες!)

 

Και πάλι ευχαριστώ!

 

ΕDIT --------------------

 

Επίσης,το πρόγραμμα δε δουλεύει αν δε δώσουμε μια τιμή του χ στην οποία να κανει interpolate ,έτσι?Επειδή δεν λειτουργεί με symbolic links η c++?

Δεν υπάρχει δηλ περίπτωση να μη δώσουμε την τιμή του χ?

 

 

ΕDIT ----------------------------

Λοιπόν,κάτι έκανα..

Πρόσθεσα τον όρο term ο οποίος θα κρατάει κάθε έναν όρο κλάσματος από κάθε συντελεστή lagrange.

Το πρόβλημα είναι πως στα αποτελέσματα μου δίνει μόνο το τελευταίο κλάσμα από κάθε συντελεστή lagrange.

Για παράδειγμα , L(0)=(x-x1)/(x0-x1) * (x-x2)/(x0-x2) * (x-x3)/(x0-x3) * (x-x4)/(x0-x4)

Ενώ θέλω να έχω τιμή για κάθε κλάσμα , το πρόγραμμα όπως το εκανα τώρα δίνει μόνο τον τελευταίο όρο ,δηλ το (χ-χ4)/(χ0-χ4).

 

 

 

>


double lagrange_polynomial(int N,double x,double *xpts ,double *L_coeff,double *term){

//N = degree of polynomial

int k,i;
double eps=10e-9; //error

//computations for finding lagrange polynomial
double sum=0;
for (k=0;k<N+1;k++){
  L_coeff[k]=1.0;
       for ( i=0;i<N+1;i++){
            if (k!=i){

               if (fabs(xpts[k]-xpts[i])<eps) {
               cout << "error : coincident nodes. Aborting...";
               exit(1);
                                           }

          //L_coeff[k]*=(x-xpts[i])/(xpts[k]-xpts[i]);
          term[k]=(x-xpts[i])/(xpts[k]-xpts[i]);
          L_coeff[k]*=term[k];
                     }
          }
sum+=L_coeff[k]*f(xpts[k]);

}
return sum;
}




int main()
{
   int deg;
   double *xpts=new double [deg];
   double *L_coeff=new double [deg];
   double *term=new double [deg];
   double result,x=0.2;


   cout <<"Give the degree of the polynomial :"<<endl;
   cin >>deg;

   for (int i=0;i<deg+1;i++){
   cout <<"\nGive the points of interpolation : "<<endl;
   cin >> xpts[i];
   }


   cout <<"\nThe Lagrange coefficients are: "<<endl;
   result=lagrange_polynomial(deg,x,xpts,L_coeff,term);
   cout <<result;

   cout << "\nThe Langrange coefficients for the given points are :" << endl;
   for (int i=0;i<deg+1;i++) {
      cout <<"L(" << xpts[i] << ") = " << L_coeff[i] << endl ;
      cout <<"\nTerm(" << i << ") = " <<term[i]<<endl;
   }

   return 0;
}

Δημοσ.

Υποθέτω ότι πρώτα δούλευες σε κάποιο συμβολικό πακέτο όπως το matlab ή το mathematica.

Mην τα συγχέεις με τις κλασσικές γλώσσες προγραμματισμού όπως η C++, fortran κλπ. - είναι εντελώς διαφορετικό πράγμα.

Και φυσικά η C++ δεν χειρίζεται συμβολικά τίποτε.

Προφανώς λοιπόν το πρόγραμμα απαιτεί όλες οι μεταβλητές να έχουν τιμή για να τις χειριστεί.

 

Αν κοιτάξεις προσεκτικά τον κώδικα στην lagrange_polynomial(...) θα δεις ότι έχει δυο βρόγχους.

Εστω x είναι το σημείο όπου ζητείται η παρεμβολή.

Το εσωτερικό for υπολογίζει τον συντελεστή Langrnage Lj(x) για κάποιο τρέχον σημείο j από τα δοθέντα.

Δηλ. π.χ. για το πρώτο σημείο βρίσκει τον L0(x)=(x-x1)/(x0-x1) * (x-x2)/(x0-x2) * (x-x3)/(x0-x3) * (x-x4)/(x0-x4)

για το δεύτερο τον L1(x)=(x-x0)/(x1-x0) * (x-x2)/(x1-x2) * (x-x3)/(x1-x3) * (x-x4)/(x1-x4) κλπ

 

Το εξωτερικό for πολ/ζει το Lj(x) που μόλις βρέθηκε με την δοθείσα τιμή yj : L0*y0 ή L1*y1 κλπ και τα προσθέτει για

να βρει τελικά το συνολικό : L0*y0 + L1*y1 + L1*y1 + L3*y3 + L4*y4 που είναι η τιμή της παρεμβολής.

 

Για να κρατάς τους μεμονωμένους όρους κεθενός Lj(x) πρέπει να χρησιμοποιήσεις ένα διπλό πίνακα.

Ο ένας δείκτης θα αναφέρεται στο σημείο xj που σαρώνει ο εξωτερικός βρόγχος και ο άλλος δείκτης στον όρο του Lj που σαρώνει ο εσωτερικός βρόγχος.

To term που έβαλες κρατά μεν την τιμή για το σημείο xj του εξωτερικού βρόγχου αλλά όχι για τους μεμονωμένους όρους που υπολογίζονται στον εσωτερικό.

Κατά την σάρωση του εσωτερικού βρόγχου το term[k] αλλάζει διαρκώς και μένει τελικά μόνον με την τελευταία τιμή, αυτό είναι το λάθος.

Για να μην παιδεύεσαι με διπλούς πίνακες, καλύτερα τύπωνε τους συντελεστές μόλις βρεθούν....

Καλή επιτυχία...

 

-

Δημοσ.

Έκανα ένα πρόγραμμα το οποίο για τα παρακάτω δεδομένα:

 

>
x = 2.9
xi(0) = 0
xi(1) = 1
xi(2) = 3

fi(0) = -5
fi(1) = 1
fi(2) = 25

μου έδωσε ως αποτέλεσμα αυτά:

 

>
L(0)=(x-1)*(x-3)/((0-1)*(0-3))
L(1)=(x-0)*(x-3)/((1-0)*(1-3))
L(2)=(x-0)*(x-1)/((3-0)*(3-1))

Για x=2.9 f(x)=23.42

 

Αν σε βολεύει έτσι να σου δώσω το πρόγραμμα αλλά για να εκτελεί όλες τις πράξεις στα πολυώνυμα Lagrange θέλει δουλειά ακόμα.

 

 

 

Για τον υπολογισμό του τελικού παρεμβολικού πολυωνύμου f(x) = a0 + a1x + ... + anx^n είναι προτιμότερο -αντί να εκτελέσεις τις πράξεις στα πολυώνυμα Lagrange- να το συνδυάσεις και με το πρόγραμμα της επίλυσης των γραμμικών συστημάτων του Smirnov με την μέθοδο Gauss.

Το αποτέλεσμα θα ισοδυναμεί με την εκτέλεση των αλγεβρικών πράξεων στα παραπάνω πολυώνυμα Lagrange.

Δηλαδή f(x) = L0(x)f0 + L1(x)f1+ ... +Ln(x)fn

Δημοσ.
V.I.Smirnov

 

Αυτό σκέφτηκα και γω (για τον διπλό πίνακα).Θα το κοιτάξω πάλι αύριο και θα το δοκιμάσω.Ευχαριστώ πολύ για τη βοήθεια!

(Ναι,έχω ασχοληθεί με matlab και mathematica αλλά μη φανταστείς τίποτα ιδιαίτερο.Θέλω να εξασκηθώ στη C++ και έχω αρκετές ασκήσεις ακόμα!)

 

 

adamco

 

Ότι μπορείς να δώσεις,χρήσιμο θα είναι ,να το κοιτάξω!

Ευχαριστώ!

Δημοσ.

Αυτό σκέφτηκα και γω (για τον διπλό πίνακα).Θα το κοιτάξω πάλι αύριο και θα το δοκιμάσω.Ευχαριστώ πολύ για τη βοήθεια!

(Ναι,έχω ασχοληθεί με matlab και mathematica αλλά μη φανταστείς τίποτα ιδιαίτερο.Θέλω να εξασκηθώ στη C++ και έχω αρκετές ασκήσεις ακόμα!)

 

Ότι μπορείς να δώσεις,χρήσιμο θα είναι ,να το κοιτάξω!

Ευχαριστώ!

 

Το πρόγραμμα είναι σε RapidQ. Την C++ την έχω στο άλλο pc που είναι για επισκευή. :rolleyes:

Εφόσον θέλεις να εξασκηθείς στην C++ μπορείς να το μεταφράσεις πολύ εύκολα. Για την επίλυση του γραμμικού συστήματος τελικά χρησιμοποίησα την μέθοδο Jοrdan.

 

>
$INCLUDE "RAPIDQ.INC"
DECLARE SUB Button1Click (Sender AS QBUTTON)
DECLARE SUB Lagrange
DECLARE SUB Jordan

dim i as integer, n as integer, x as double, xe as double
dim CRLF as string
CRLF = chr$(13)+chr$(10) 
dim c as double, p as double
dim txt as string, denom as string, tmp1 as string, tmp2 as string
dim a(20, 21) as double, b(20, 21) as double, w as double
dim r as integer, j as integer, lt as integer, nc as integer
NMAX = 5
dim xi(NMAX) as double
dim fi(NMAX) as double

xe=.9
xi(0)=-1
xi(1)=-0.5
xi(2)=0
xi(3)=0.5
xi(4)=1

fi(0)=-1
fi(1)=0
fi(2)=1
fi(3)=0
fi(4)=-1

CREATE Form AS QFORM
   Caption = "Form1"
   Width = 620
   Height = 340
   Center
   CREATE Button1 AS QBUTTON
       Caption = "Button1"
       Left = 24
       Top = 300
       OnClick = Button1Click
   END CREATE
   CREATE Edit1 AS QEDIT
       Text = ""
       Left = 24
       Top = 16
       width=1000
       TabOrder = 1
   END CREATE
   CREATE Edit2 AS QRICHEDIT
       Left = 24
       Top = 48
       width=1000
       height=250
       Font.Name="Courier"
       TabOrder = 2
   END CREATE
END CREATE

Form.ShowModal

Sub Button1Click (Sender AS QBUTTON)

for k = 0 to NMAX-1
    edit1.text = edit1.text+str$(xi(k))+ "/"
next k

Call Lagrange

edit2.addstrings CRLF
edit2.text = edit2.text+"Για x = " + str$(xe) +" f(x) = "+ str$(p)
edit2.addstrings CRLF

txt="f(x) = "

Call Jordan    

end sub


Sub Lagrange
n=NMAX
p=0
denom = "/("
for i = 0 to n-1
   c = fi(i)
      for j = 0 to n-1
           if i=j then goto 100
           c = c*(xe-xi(j))/(xi(i)-xi(j))
           
           if xi(j)<0 then tmp1="+"
           if xi(j)>=0 then tmp1="-"
           txt=txt+"(" + "x" +tmp1 +str$(abs(xi(j))) +")*"            

           if xi(j)<0 then tmp1="+"
           if xi(j)>=0 then tmp1="-"
           denom=denom + "(" +  str$(xi(i))+ tmp1+ str$(abs(xi(j)))+ ")*"

100    next j
      p=p+c
      
      denom = denom + ")"
      txt=left$(txt,len(txt)-1)
      denom =left$(denom,len(denom)-2)+")"
      edit2.addstrings "L"+str$(i)+"=" +txt + denom 
      txt=""
      denom="/("
next i
end sub


Sub Jordan
n=NMAX
nc = n + 1
for i = 1 to n
   for j=1 to n
       a(i,j)=xi(i-1)^(j-1)
   next j
   a(i,nc)=fi(i-1)
next i
   
for r = 1 to n
   w = a(r, r)
   c = r
   for t = r + 1 to n
   if abs(a(t, r)) < abs(w) then goto 300
   w = a(t, r)
   c = t

300 next t
for lt = 1 to nc
   prop = a(r, lt)
   a(r, lt) = a(c, lt)
   a(c, lt) = prop
next lt
for j = 1 to nc
   b(r, j) = a(r, j) / w
next j
for i = 1 to n
   if i = r then goto 500
   for j = 1 to nc
       b(i, j) = a(i, j) - a(i, r) * b(r, j)
   next j
500 next i
for i = 1 to n
   for j = 1 to nc
       a(i, j) = b(i, j)
   next j
next i
next r

for i = 1 to n
Edit2.addstrings str$(a(i, nc))
next i
Edit2.addstrings CRLF

tmp1=""
for i = 1 to n

if a(i, nc)<>0 then

  if i=1 then 
     tmp2=""   
     else
     tmp2="x" + "^" + str$(i-1)
     end if
     
  if a(i, nc)>0 then tmp1="+"
  if a(i, nc)<0 then tmp1=""
  txt=txt+ tmp1+str$(a(i, nc)) + tmp2

end if   
next i

Edit2.text=Edit2.text + txt

end sub

 

 

Αν το τρέξεις το πρόγραμμα θα σου δώσει το ίδιο παρεμβολικό πολυώνυμο με αυτό του αρχικού link:

 

>
L0=(x+0.5)*(x-0)*(x-0.5)*(x-1)/((-1+0.5)*(-1-0)*(-1-0.5)*(-1-1))
L1=(x+1)*(x-0)*(x-0.5)*(x-1)/((-0.5+1)*(-0.5-0)*(-0.5-0.5)*(-0.5-1))
L2=(x+1)*(x+0.5)*(x-0.5)*(x-1)/((0+1)*(0+0.5)*(0-0.5)*(0-1))
L3=(x+1)*(x+0.5)*(x-0)*(x-1)/((0.5+1)*(0.5+0.5)*(0.5-0)*(0.5-1))
L4=(x+1)*(x+0.5)*(x-0)*(x-0.5)/((1+1)*(1+0.5)*(1-0)*(1-0.5))

Για x = 0.9 f(x) = -1.0304

1
0
-4.66666667
0
2.66666667

f(x) = +1-4.66666667x^2+2.66666667x^4

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...