#include #include #include #include #include #define zloty = 0.618033988749 double interpolacja_liniowa(); double interpolacja_kwadratowa(); double interpolacja_Lagrangea(); double Cubic_Spline(); double Wmaciez_CS(int size, double * v, double * u, double * w, int zmiana);//funkcja do licznia wyznacznika maciezy do Cubic_Spline() zmiana(0)-głowny wyznacznik,zmiana(1)-kolumny podmienione na v(i) void mciez_troj(int size, double ** maciez); //rozwiazywanie rownan double metoda_bisekcji(double(*F)(double)); double metoda_zgadywana(double(*F)(double));//iteraqcyjna double zloty_podzial_min(double(*F)(double)); double zloty_podzial(double(*F)(double)); double metoda_falsi(double(*F)(double)); double metoda_siecznych(double(*F)(double)); double metoda_newtona_rapshona(double(*F)(double), double(*FP)(double)); double metoda_newtona_rapshona_2_stopnia(double(*F)(double), double(*FP)(double), double(*FPP)(double)); double metoda_halleya(double(*F)(double), double(*FP)(double), double(*FPP)(double)); //funkcje matematyczne double funkcja(double x); double funkcja1(double x); double funkcja2(double x); double funkcja3(double x); double funkcja4(double x); double funkcja4P(double x); double funkcja4PP(double x); double funkcja5(double x); double funkcja6(double x); //calki double motoda_trapezow(double(*F)(double)); double metoda_simpsona(double(*F)(double)); double metoda_monte_carlo(double(*F)(double));//losowa int main(int argc, char* argv[]) { do { //std::cout << "interpolacja_liniow: " << interpolacja_liniowa(); //std::cout << "ninterpolacja_kwadratowa: " << interpolacja_kwadratowa(); //std::cout << "ninterpolacja_Lagrangea: " << interpolacja_Lagrangea(); //std::cout << "nCubic_Spline: " << Cubic_Spline(); //std::cout << "nnZloty Podzial min: " << zloty_podzial_min(funkcja2); //std::cout << "nnZloty Podzial: " << zloty_podzial(funkcja); //std::cout << "nnmetoda bisekcji: " << metoda_bisekcji(funkcja2); //std::cout << "nnmetoda zgadywana: " << metoda_zgadywana(funkcja1); //std::cout << "nnmetoda_falsi: " << metoda_falsi(funkcja4); //std::cout << "nnmetoda_siecznych: " << metoda_siecznych(funkcja4); //std::cout << "nnmetoda_newtona_rapshona: " << metoda_newtona_rapshona(funkcja4, funkcja4P); //std::cout << "nnmetoda_newtona_rapshona_2_stopnia: " << metoda_newtona_rapshona_2_stopnia(funkcja4, funkcja4P,funkcja4PP); //std::cout << "nnmetoda_halleya: " << metoda_halleya(funkcja4, funkcja4P, funkcja4PP); //std::cout << "nnmotoda_trapezow: " << motoda_trapezow(funkcja6); //std::cout << "nnmotoda_trapezow: " << metoda_simpsona(funkcja6); //std::cout << "nnmetoda_monte_carlo: " << metoda_monte_carlo(funkcja6); ..std::cout << "nn"; std::cout << "end"; if (getch() == 27)break; std::cout << "nn"; } while (1); return 0; } double interpolacja_liniowa() { double x[3]; double y[3]; std::cout << "podaj punkt :n x: "; std::cin >> x[2]; //std::cout << "y: "; //std::cin >> y[2]; std::cout << "podaj punkt 0 :n x0: "; std::cin >> x[0]; std::cout << "y0: "; std::cin >> y[0]; std::cout << "podaj punkt 1 :n x1: "; std::cin >> x[1]; std::cout << "y1: "; std::cin >> y[1]; return y[2] = y[0] + ((y[1] - y[0]) / (x[1] - x[0]))*(x[2] - x[0]); } double interpolacja_kwadratowa() { double x[4]; double y[4]; std::cout << "podaj punkt :n x: "; std::cin >> x[3]; //std::cout << "y: "; //std::cin >> y[3]; std::cout << "podaj punkt 0 :n x0: "; std::cin >> x[0]; std::cout << "y0: "; std::cin >> y[0]; std::cout << "podaj punkt 1 :n x1: "; std::cin >> x[1]; std::cout << "y1: "; std::cin >> y[1]; std::cout << "podaj punkt 2 :n x2: "; std::cin >> x[2]; std::cout << "y2: "; std::cin >> y[2]; return y[3] = ((x[3] - x[1]) / (x[0] - x[1]))*((x[3] - x[2]) / (x[0] - x[2]))*y[0] + ((x[3] - x[0]) / (x[1] - x[0]))*((x[3] - x[2]) / (x[1] - x[2]))*y[1] + ((x[3] - x[0]) / (x[2] - x[0]))*((x[3] - x[1]) / (x[2] - x[1]))*y[2]; } double interpolacja_Lagrangea() { int _size; std::cout << "ile :"; std::cin >> _size; double *x = new double[_size + 1]; double *y = new double[_size]; double *s = new double[_size]; std::cout << "podaj x do obliczen"; std::cin >> x[_size]; for (int i = 0; i < _size; i++) { std::cout << "podaj x" << i << ": "; std::cin >> x[i]; std::cout << "podaj y" << i << ": "; std::cin >> y[i]; } for (int i = 0; i < _size; i++) { s[i] = y[i]; for (int j = 0; j < _size; j++) { if (x[i] != x[j]) { s[i] *= (x[_size] - x[j]); } } for (int j = 0; j < _size; j++) { if (x[i] != x[j]) { s[i] /= (x[i] - x[j]); } } } double suma = 0; for (int i = 0; i < _size; i++) { suma += s[i]; } return suma; delete[] x,y,s; } double Cubic_Spline() { int _size = 0; std::cout << "ile :"; std::cin >> _size; double mainx = 0; double mainy = 0; double W; std::cout << "dla jakiego x :"; std::cin >> mainx; double *x = new double[_size]; double *y = new double[_size]; double *a = new double[_size]; double *b = new double[_size]; double *c = new double[_size]; double *d = new double[_size]; double *h = new double[_size]; double *v = new double[_size]; double *u = new double[_size]; double *w = new double[_size]; c[0] = 0; c[_size - 1] = 0; for (int i = 0;i < _size;i++) { std::cout << "podaj x" << i << " :"; std::cin >> x[i]; std::cout << "podaj y" << i << " :"; std::cin >> y[i]; } for (int i = 0; i < _size; i++) { a[i] = y[i]; //std::cout << "a[" << i << "]" << a[i] << " "; } //std::cout << "nn"; for (int i = 0; i < _size - 1; i++) { h[i] = x[i + 1] - x[i]; //std::cout << "h[" << i << "]" << h[i] << " "; } //std::cout << "nn"; for (int i = 1; i < _size - 1; i++) { u[i] = (h[i - 1] / (h[i - 1] + h[i])); //std::cout << "u[" << i << "]" << u[i] <<" "; } std::cout << "nn"; for (int i = 1; i < _size - 1; i++) { w[i] = (h[i] / (h[i - 1] + h[i])); //std::cout << "w[" << i << "]" << w[i] << " "; } std::cout << "nn"; for (int i = 1; i < _size - 1; ++i) { v[i] = (((y[i + 1] - y[i] / h[i]) - (y[i] - y[i - 1] / h[i - 1])) / (h[i - 1] + h[i])); //std::cout << "v[" << i << "]" << v[i] << " "; } W = Wmaciez_CS(_size,v,u,w,0); //std::cout << "nn wyznacznik = " << W << "nn"; for (unsigned int i = 1; i < _size - 1; ++i) { c[i] = (Wmaciez_CS(_size, v, u, w, i) / W); //std::cout << "c[" << i << "]" << c[i] << " "; } //std::cout << "nn"; //for (unsigned int i = 1; i < _size - 1; ++i) //{ // std::cout << "w[" << i << "]" << Wmaciez_CS(_size, v, u, w, i) << " "; //} //std::cout << "nn"; for (int i = 0; i < _size - 1; ++i) { d[i] = ((c[i + 1] - c[i]) / 3 * h[i]); //std::cout << "d[" << i << "]" << d[i] << " "; } //std::cout << "nn"; for (unsigned int i = 0; i < _size; i++) { b[i] = (1 / h[i]) * (y[i + 1] - y[i] - c[i] * (h[i] * h[i]) - d[i] * (h[i] * h[i] * h[i])); if (i == _size - 1) { b[i] = b[i - 1] + 2 * (c[i - 1] * h[i - 1]) + 3 * (d[i - 1] * h[i - 1]); } //std::cout << "b[" << i << "]" << b[i] << " "; } std::cout << "nn"; //x mniejsze if (mainx < x[0]) { mainy = a[0] + b[0] * (mainx - x[0]); } //x wieksze if (mainx > x[_size-1]) { mainy = a[_size - 1] + b[_size-2] * (mainx - x[_size - 1]); } //x w przedziale for (int i = 0; i < _size - 1; i++) { if (x[i] <= mainx && mainx <= x[i + 1]) { mainy = a[i] + b[i] * (mainx - x[i]) + c[i] * ((mainx - x[i])*(mainx - x[i])) + d[i] * ((mainx - x[i])*(mainx - x[i])*(mainx - x[i])); } } delete[] x,y,a,b,c,d,w,v,u,h; return mainy; } double Wmaciez_CS(int size, double * v, double * u, double * w, int zmiana) { double **maciez = new double *[size]; //wyznacznik double W = 1.0; size -= 2; for (unsigned int i = 0; i < size; i++) { maciez[i] = new double[size]; } for (unsigned int i = 0; i < size; i++) { for (unsigned int j = 0; j < size; j++) { if (i == j) maciez[i][j] = 2; else if (i + 1 == j) maciez[i][j] = u[j]; else if (i == j + 1) maciez[i][j] = w[j + 1]; else maciez[i][j] = 0; } if (zmiana != 0) { for (unsigned int i = 0; i < size; i++) { maciez[i][zmiana - 1] = 3 * v[i + 1]; } } } for (int w = 0; w < size; w++) { mciez_troj(size, maciez);//licze maciez trójkątną } for (int i = 0; i < size; i++) { W *= maciez[i][i]; } for (unsigned int i = 0; i < size; i++) { delete[] maciez[i]; } delete[] maciez; return W; } void mciez_troj(int size, double ** maciez) { for (int i = 0; i < size - 1; i++) { for (int j = i + 1; j < size; j++) { for (int q = size - 1; q >= i; q--) { maciez[j][q] = maciez[j][q] - maciez[j][i] * maciez[i][q] / maciez[i][i]; } } } } double metoda_bisekcji(double(*F)(double)) { double a,b; double E = 0.000001; double i = 0; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; std::cout<< F(a) << " " << F(b) << "nn"; std::cout << F(a) * F(b) << "nn"; if (F(a) * F(b) > 0 /*|| (F(a) * F(b) != -INFINITY)*/) { while (i<100 && F(a) * F(b) > 0) { b -= b / 100; //std::cout << "F(b) = " << F(b) << "n"; i++; } if (F(a) * F(b) > 0) { std::cout << "nie posiada miejsca zerowego!!!!nFunkcja nie jest ciałga na podanym przedzialenZwracam zeronn"; return 0.; } i = 0; } while(b-a>E && i<60) { if (F((a + b) / 2) * F(a) < 0) b = (a + b) / 2; else { a = (a + b) / 2; }; i++; } std::cout << "ilosc = " << i <<"nn" ; return (a+b)/2; } double metoda_zgadywana(double(*F)(double)) { double a, b; double E = 0.000001; double i = 0; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; if (F(a) * F(b) > 0 /*|| (F(a) * F(b) != -INFINITY)*/) { while (i<100 && F(a) * F(b) > 0) { b -= b / 100; //std::cout << "F(b) = " << F(b) << "n"; i++; } if (F(a) * F(b) > 0) { std::cout << "nie posiada miejsca zerowego!!!!nFunkcja nie jest ciałga na podanym przedzialenZwracam zeronn"; return 0.; } i = 0; } while (F(a) * F(b) < 0) { a += (b - a) / 1000; } return a; } double zloty_podzial_min(double(*F)(double)) { double a,b; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; double k = (sqrt(5.) - 1.) / 2.; double E = 0.00000001; int i = 0; if (F(a) * F(b) > 0 /*|| (F(a) * F(b) != -INFINITY)*/) { while (i<100 && F(a) * F(b) > 0) { b -= b / 100; //std::cout << "F(b) = " << F(b) << "n"; i++; } if (F(a) * F(b) > 0) { std::cout << "nie posiada miejsca zerowego!!!!nFunkcja nie jest ciałga na podanym przedzialenZwracam zeronn"; return 0.; } i = 0; } while (b - a>E && i<60) { if (F(a + (b - a)*k) * F(a) < 0) b = a + (b - a)*k; else { a = a + (b - a)*k; }; i++; } std::cout << "ilosc = " << i << "nn"; return (a + b) / 2; } double zloty_podzial(double(*F)(double)) { double a, b; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; if (F(a) * F(b) > 0) { std::cout << "nie posiada miejsca zerowego!!!!nFunkcja nie jest ciałga na podanym przedzialenZwracam zeronn"; return 0.; } else { double k = (sqrt(5.) - 1.) / 2.; double xL = b - k * (b - a); double xR = a + k * (b - a); double E = 0.0000001; std::cout << "F(xl) = " << F(xL) << " f(xr) = " << F(xR) << "n"; std::cout << "xl = " << xL << " xr = " << xR << "n"; std::cout << "a = " << a << " b = " << b << "n"; //std::cout << "xl = " << F(xL) << " xr = " << F(xR) << "n"; while (b - a > E)//dokladność { std::cout << "F(xl) = " << F(xL) << " f(xr) = " << F(xR) << "n"; std::cout << "xl = " << xL << " xr = " << xR << "n"; std::cout << "a = " << a << " b = " << b << "n"; if (F(xL) < F(xR)) { // wybierz przedział [a, xR] b = xR; xR = xL; xL = b - k * (b - a); } else { // wybierz przedział [xL, b] a = xL; xL = xR; xR = a + k * (b - a); } std::cout << "xl = " << xL << " xr = " << xR << "n"; } return F((a + b) / 2.); } } double metoda_falsi(double(*F)(double)) { double x0, f0, fp; double a, b; double E = 0.0000001; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; do { x0 = (a*F(b) - b*F(a)) / (F(b) - F(a)); f0 = F(x0); fp = F(a); if (f0 * fp < 0) b = x0; else a = x0; } while (fabs(f0) > E); return x0; } double metoda_siecznych(double(*F)(double)) { double x0, f0, fp, fk; double a, b; double E = 0.0000001; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; fp = F(a); fk = F(b); do { x0 = (a*fk - b*fp) / (fk - fp); f0 = F(x0); a = b; fp = fk; b = x0; fk = f0; } while (fabs(f0) > E); return x0; } double metoda_newtona_rapshona(double(*F)(double), double(*FP)(double)) { double a, b, x0, x1; double E = 0.0000001; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; if (F(a)*F(b) >= 0) std::cout << "zly przedzial!!!"; else { std::cout << "podaj miejsce startowe: "; std::cin >> x0; while (fabs(F(x0)) > E ) { x1 = x0 - F(x0) / FP(x0); x0 = x1; } } return x0; } double metoda_newtona_rapshona_2_stopnia(double(*F)(double), double(*FP)(double), double(*FPP)(double)) { double a, b, x0, x1; double E = 0.0000001; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; if (F(a)*F(b) >= 0) std::cout << "zly przedzial!!!"; else { std::cout << "podaj miejsce startowe: "; std::cin >> x0; while (fabs(F(x0)) > E) { x1 = x0 - ((FP(x0) - sqrt(pow(FP(x0), 2) - 2 * F(x0)*FPP(x0))) / FPP(x0)); x0 = x1; } } return x0; } double metoda_halleya(double(*F)(double), double(*FP)(double), double(*FPP)(double)) { double a, b, x0, x1; double E = 0.0000001; std::cout << "podaj a :"; std::cin >> a; std::cout << "podaj b :"; std::cin >> b; if (F(a)*F(b) >= 0) std::cout << "zly przedzial!!!"; else { std::cout << "podaj miejsce startowe: "; std::cin >> x0; std::cout << x0 << " "; while (fabs(F(x0)) > E) { x1 = x0 - (2 * F(x0)*FP(x0)) / (2 * pow(FP(x0), 2) - F(F(x0))*FPP(x0)); x0 = x1; std::cout << x0 << " "; } } return x0; } double funkcja(double x) { if (x == 0)return -1.7e-308; else return x - (4 / pow(x, 2)); } double funkcja1(double x) { if (x == 2)return -1.7e-308; else return (pow(x,2)-3)/(x-2); } double funkcja2(double x) { return pow(x, 2) - 4 + sin(x); } double funkcja3(double x) { return x*x; } double funkcja4(double x) { return pow(x,3)+pow(x,2)-3*x-3; } double funkcja4P(double x) { return 3*pow(x,2)+2*x-3; } double funkcja4PP(double x) { return 6 * x, +2; } double funkcja5(double x) { return pow(x, 2) - x + 4; } double funkcja6(double x) { return pow(x, 2) + 2*x ; } double motoda_trapezow(double(*F)(double)) { double a, b, ile,k; std::cout << "podaj poczatek przedziału: "; std::cin >> a; std::cout << "podaj koniec przedziału: "; std::cin >> b; std::cout << "podaj ile: "; std::cin >> ile; double suma = 0.; k = (b - a) / ile; for (int i = 1; i < ile; i++) { suma += F(a + i * k); } suma = (suma + (F(a) + F(b)) / 2) * k; return suma; } double metoda_simpsona(double(*F)(double)) { double a, b, ile, k, x,s; std::cout << "podaj poczatek przedziału: "; std::cin >> a; std::cout << "podaj koniec przedziału: "; std::cin >> b; std::cout << "podaj ile: "; std::cin >> ile; double suma = 0.; s = 0.; k = (b - a) / ile; for (int i = 1; i <= ile; i++) { x = a + i*k; s += F(x - k / 2); if (i < ile) suma += F(x); } suma = k / 6 * (F(a) + F(b) + 2 * s + 4 * s); return suma; } double metoda_monte_carlo(double(*F)(double)) { srand(time(NULL)); double a, b, ile, k, x, s; std::cout << "podaj poczatek przedziału: "; std::cin >> a; std::cout << "podaj koniec przedziału: "; std::cin >> b; std::cout << "podaj ile: "; std::cin >> ile; double suma = 0.; s = 0.; k = b - a; for (int i = 1; i <= ile; i++) { suma += F(a + ((double)rand() / (double)(RAND_MAX + 1)*k)); } suma = k * suma / ile; return suma; }