C/Przykłady z komentarzem: Różnice pomiędzy wersjami

Znajdowanie wzoru fuunkcji kwadratowej przechodzącej przez trzy punkty
(revert ("czwarta potęga dwójki to 8"?))
(Znajdowanie wzoru fuunkcji kwadratowej przechodzącej przez trzy punkty)
 
Powyższy przykład może być odrobinę niezrozumiały, dlatego przyda się kilka słów wyjaśnienia. Pliki nagłówkowe, które dołączamy zawierają deklarację nowych dla Ciebie funkcji - socket(), connect(), write() oraz read(). Oprócz tego spotkałeś się z nową strukturą - sockaddr_in. Wszystkie te obiekty są niezbędne do stworzenia połączenia. Aby dowiedzieć się więcej nt. wszystkich użytych tu funkcji i struktur musisz odwiedzić podręcznik o [[Programowanie w systemie UNIX|programowaniu]] w systemie UNIX.
 
===Znajdowanie wzoru funkcji kwadratowej przechodzącej przez trzy punkty===
 
<source lang=c>
 
// gcc m.c -Wall
// ./a.out
 
# include <stdio.h>
 
//
//
// znane 3 punkty : (x0,y0), (x1,y1), (x2,y2)
// dane do testów
// (3,10),(1,0),(-2,15) -> f(x)=2x^2 -3x +1 http://matematyka.pisz.pl/strona/1394.html
// (1,−4), (2,3), (−1,0) -> f(x)=3x2−2x−5 http://matematyka.pisz.pl/forum/52119.html
// A(1,-1), B(0,0), C(-1,3): -> f(x)=x2-2x. http://www.traugutt.miasto.zgierz.pl/matma/kwadratowa.html
// (-6 ,51),(-5 , 38), (-4 , 27) -> The solution is a = 1, b = -2 and c = 3 http://answers.yahoo.com/question/index?qid=20090814183525AA26rSD
// (2 , -8),(1 , 0) (-2 , 0) -> f(x) = -2(x - 1)(x + 2) = - 2 x^2 - 2 x + 4 http://www.analyzemath.com/quadraticg/Tutorial1.html
// (1, 3), (−1, 4), (2, 1) -> a = −1/2 , b = −1/2 , and c = 4
// (−1,2), (0,3) and (1,6) -> y=x2+2x+3 http://www.amsi.org.au/ESA_Senior_Years/SeniorTopic2/2a/2a_2content_8.html
 
 
 
double wx[3]={3,1,-2}; // double wx[3]={x0,x1,x2};
double wy[3]={10,0,15}; // double wy[3]={y0,y1,y2};
 
// szukamy trójmianu kwadratowego
// f(x) = ax^2 + bx + c
//przechodzącego przez te 3 punkty = interpolacja kwadratowa
//
// układ 3 równań liniowych
// z 3 niewiadomymi : a, b, c
// a*x0^2 + b*x0 + c = y0
// a*x1^2 + b*x1 + c = y1
// a*x2^2 + b*x2 + c = y2
 
 
 
// układ 3 równań liniowych postaci :
// a*wi1 + b*wi2 + c*wi3 = yi
//
// win jest współczynnikiem : w
// gdzie pierwsza cyfra i jest numerem równia ( rząd )
// druga cyfra n jest numerem kolumny ( szukanej a, b, c )
//
// a*w00 + b*w01 + c*w02 = y0
// a*w10 + b*w11 + c*w12 = y1
// a*w20 + b*w21 + c*w22 = y2
 
// wi0 = xi^2
// wi1 = xi
// wi2 = 1
 
 
 
 
// 4 macierze :
//double ws[3][3] = {{w00,w01,w02},{w10,w11,w12}, {w20,w21,w22}};
// w kolumnie n jest yi
//double wa[3][3] = {{y0,w01,w02},{y1,w11,w12}, {y2,w21,w22}};
//double wb[3][3] = {{w00,y0,w02},{w10,y1,w12}, {w20,y2,w22}};
//double wc[3][3] = {{w00,w01,y0},{w10,w11,y1}, {w20,w21,y2}};
 
// a=wa/ws
// b= wb/ws
// c=wc/ws
/*
w = wyznacznik macierzy 3x3
 
1 2 3 w11 w12 w13 a1 b1 c1 w00 w01 w02
4 5 6 w21 w22 w23 a2 b2 c2 w10 w11 w12
7 8 9 w31 w32 w33 a3 b3 c3 w20 w21 w22
 
det = 1*5*9 + 2*6*7 + 3*4*8 - 3*5*7 - 2*4*9 - 1*6*8 =
det = w11*w22*w33 + w21*w32*w13 + w31*w12*w23 - w31*w22*w13 - w11*w32*w23 - w21*w12*w33;
det = a1*b2*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1 - a1*b3*c2 - a2*b1*c3;
det = w00*w11*w22 + w10*w21*w02 + w20*w01*w12 - w20*w11*w02 - w00*w21*w12 - w10*w01*w22;
 
 
http://www.sciaga.pl/tekst/41303-42-obliczanie_wyznacznikow_macierzy_c_c
 
test :
1 2 3
6 5 4
3 7 2
----
63.0000
 
 
http://www.matematyka.pl/12881.htm
3 1 1
2 2 3
1 3 2
----
-12
 
*/
// macierze do testów funkcji DeterminatOfMatrix33
double t1[3][3] = {{1,2,3},{6,5,4},{3,7,2}}; // det = 63
double t2[3][3] = {{3,1,1},{2,2,3},{1,3,2}}; // det = -12
// w = 1*5*9 + 2*6*7 + 3*4*8 - 3*5*7 - 2*4*9 - 1*6*8 = 0
double t3[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; // det = 0
double t4[3][3] = {{2,1,1},{1,-1,-1},{1,2,1}}; // det = 3 http://www.purplemath.com/modules/cramers.htm
 
 
double DeterminatOfMatrix33(double w[3][3])
{
return ( w[0][0]*w[1][1]*w[2][2] + w[1][0]*w[2][1]*w[0][2] + w[2][0]*w[0][1]*w[1][2] - w[2][0]*w[1][1]*w[0][2] - w[0][0]*w[2][1]*w[1][2] - w[1][0]*w[0][1]*w[2][2] );
}
 
// i =0 give det(wa);
// i =1 give det(wb)
// i =2 give det(wc)
double GiveDet_n(int n, double ws[3][3], double wy[3])
{
int i;
double wi[3][3]; // use local copy, do not change ws !
// copy values from ws to wi
for (i=0; i<3; ++i)
{
wi[i][0]= ws[i][0];
wi[i][1]= ws[i][1];
wi[i][2]= ws[i][2];
}
// copy wy column
for (i=0; i<3; ++i)
wi[i][n]=wy[i];
//
printf(" w%d = {",n);
for (i=0; i<3; ++i)
{
printf("{ %f ,",wi[i][0]);
printf("%f ,",wi[i][1]);
printf("%f }, \n",wi[i][2]);
}
return DeterminatOfMatrix33(wi);
}
 
 
// main matrix of system of equations
double GiveMatrixOfSystem(double wx[3], double ws[3][3])
{
int i;
printf(" ws = {");
for (i=0; i<3; ++i)
{
ws[i][0]= wx[i]*wx[i]; printf("{ %f ,",ws[i][0]);
ws[i][1]= wx[i]; printf("%f ,",ws[i][1]);
ws[i][2]= 1; printf("%f }, \n",ws[i][2]);
}
 
return DeterminatOfMatrix33(ws);
}
 
 
/* =================== main ============================================================*/
 
int main()
{
 
double ws[3][3];
double dets,deta, detb, detc;
double a,b,c;
dets = GiveMatrixOfSystem(wx,ws);
deta = GiveDet_n(0,ws,wy);
detb = GiveDet_n(1,ws,wy);
detc = GiveDet_n(2,ws,wy);
a = deta/dets;
b = detb/dets;
c = detc/dets;
 
printf("a = %f ; b = %f ; c = %f ;\n",a,b,c);
return 0;
}
 
</source>
6160

edycji