Methods.ppt
- Количество слайдов: 53
Некоторые функции библиотеки <math. h> |x| int abs(int x) long labs(long x) double fabs(double x) xy double pow(double x, double y) ex double exp(double x) Ln x double log(double x) Lg x double log 10(double x) LOG a X = Ln X / Ln a Округление вниз/вверх double ceil(double x) double floor(double x) Остаток от деления x/y double fmod(double x, double y) Квадратный корень double sqrt(double x) Гипотенуза double hypot(double x, double y) Тригонометрические функции: double(double) sin(x) cos(x) tan(x) asin(x) acos(x) atan 2(y, x) – для y/x M_PI = p M_PI_2 = p/2 M_PI_4 = p/4 M_1_PI = 1/p
Методы решения нелинейных уравнений
Методы решения нелинейных уравнений I этап – отделение корней F(x) b 2 a 1 b 1 a 3 II этап получение приближенного значения корня с заданной b 3 точностью ε одним из методов a 2 Если F(x) на интервале [ab] • Непрерывна • Монотонна • Меняет знак То на [ab] есть ровно один корень
Методы решения нелинейных уравнений Пример. Найти корень уравнения x 3+2 x-10=0 Определим необходимый для поиска корня интервал [a, b]. Вычислим значения функции F(x)=x 3+2 x-10 в нескольких точках. F(0)= -10 F(1)= -7 F(2)=+2 видим, что на [1, 2] произошла смена знака. Проверим монотонность функции на этом интервале (непрерывность в данном случае не вызывает сомнений). F’(x)=3 X 2+2>0 означает монотонный рост. Вывод: корень заданного уравнения следует искать на интервале [1, 2].
Метод половинного деления x 3+2 x-10=0 a=1 F(a)= -7 b=2 F(b)=+2 x=(a+b)/2 x=1, 5 + F(x)=-3, 6 a - -> x - b
Метод половинного деления k a b x f(a) f(b) f[x] b-a 0 1 2 1, 5 -7 2 -3, 625 1 1 1, 5 2 1, 75 -3, 625 2 -1, 14063 0, 5 2 1, 75 2 1, 875 -1, 1406 2 0, 3417 0, 25 3 1, 75 1, 8125 -1, 1406 0, 3417 -0, 42065 0, 125 4 1, 8125 1, 875 1, 84375 -0, 4206 0, 3417 -0, 0448 0, 0625 5 1, 8437 1, 875 1, 8593 -0, 0448 0, 3417 0, 1471 0, 03125 6 1, 8437 1, 8593 1, 8515 -0, 0448 0, 14711 0, 05080 0, 0156 7 1, 8437 1, 8515 1, 8476 -0, 0448 0, 0508 0, 0029 0, 0078
Метод половинного деления (дихотомии, бисекции) Ввод a, b, x=(a+b)/2 ДА f(x)=0 НЕТ f(a) f(x)>0 ДА НЕТ a=x ДА b=x b-a > НЕТ Вывод x
Метод половинного деления (дихотомии, бисекции) float dix(float a, float b, float eps, float (*v)(float)) { float x, z; z=v(a); do{ x=(a+b)/2; if(v(x)==0) return x; if(z*v(x)>0) a=x; else b=x; }while((b-a)>eps); return. 5*(a+b); }
Главная программа #include<stdio. h> #include<conio. h> #include<math. h> float dix(float, float(*)(float)); float f(float); main() { float x, a, b, eps; printf("n Задайте границы интервала и точность: "); scanf("%f%f%f", &a, &b, &eps); x=dix(a, b, eps, f); printf("n x=%3. 2 fn F=%f", x, f(x)); getch(); } float f(float x) { return x*x*x+2*x-10; }
Метод хорд a 0 a 1 a 2 b
Метод хорд a 0 b 1 b 0
Метод хорд float mx(float a, float b, float (*f)(float), float eps) { float x; do{ x=(a*f(b)-b*f(a))/(f(b)-f(a)); if(f(x)==0) return x; else if(f(a)*f(x)>0) a=x; else b=x; }while(fabs(f(x))>eps); return x; }
Метод хорд
Метод Ньютона (касательных) y-F(x 0)=F’(x 0) (x-x 0) Уравнение касательной x 1=x 0 - F(x 0)/F’(x 0) Условие сходимости x 2=x 1 - F(x 1)/F’(x 1) F(x)*F’’(x)>0 a |x 2 -x 1| < ε x 2 x 1 x 0=b |F(x 2)| < ε Примечание: Метод Ньютона накладывает на отрезок [ab] дополнительное условие: график F(x) не должен иметь точек перегиба, т. е. быть исключительно выпуклым или вогнутым на всем [ab]. Тогда, очевидно, условие сходимости на одном из концов [ab] обязательно будет соблюдаться, а на другом — нет.
Метод Ньютона (касательных) F’’>0 b a a b F’’<0 Условие сходимости F(x)*F’’(x)>0 b a F’’>0 a F’’<0 b
Метод Ньютона (касательных) k Xk f(Xk) f '(Xk) Xk+1 |Xk+1 -Xk| 0 2 2 14 1, 857143 0, 142857 1 1, 857143 0, 119534 12, 34694 1, 847462 0, 009681 2 1, 847462 0, 000521 12, 23934 1, 847419 0, 00005
Метод Ньютона (касательных)
Метод Ньютона (касательных) float Newt(float a, float b, float (*f)(float), float(*f 1)(float), float(*f 2)(float), float eps) { float x, t; if(f(a)*f 2(a)>0) t=a; else t=b; do{ x=t; t=x-f(x)/f 1(x); }while(fabs(x-t)>eps); return t; }
Метод простой итерации x 3+2 x-10=0 a=1 F(a)= -7 b=2 y=x F(b)=+2 Преобразуем к виду x = j (x) x 1 = j (x 0) x 2 = j (x 1) y = j (x) j (x 1) j (x 0) X x 1 x 2 x 0 |x 2 -x 1| < ε … Сходящийся процесс
Метод простой итерации y = j (x) y=x y = j (x) j (x 1) j (x 0) x x 1 x 2 x 0 Сходящийся процесс |j’(x)| <1 x x 1 x 0 x 2 Расходящийся процесс |j’(x)| >1
Метод простой итерации F(x)=0 Преобразуем к виду x = j (x) Пусть M = max | F’(x)| на [ab] -1 0 1 + для F’(x)<0 - для F’(x)>0
Метод простой итерации x 3+2 x-10=0 a=1 F(a)= -7 b=2 F(b)=+2 Преобразуем к виду x x = j (x) F’(x)=3 x 2+2 >0 на [1, 2] M=max|F’(x)|=F’(2)=14
Метод хорд и касательных t = b - F(b )/ F’(b) a x t b
Метод хорд и касательных t = b - F(b )/ F’(b) a x t b
Метод хорд и касательных
Метод хорд и касательных float xk(float a, float b, float (*f)(float), float(*f 1)(float), float(*f 2)(float), float eps) { float x, t; if(f(a)*f 2(a)>0) {t=a; x=b; } else {t=b; x=a; } do{ t=t-f(t)/f 1(t); x=(t*f(x)-x*f(t))/(f(x)-f(t)); }while(fabs(x-t)>eps); return. 5*(t+x); }
Метод половинного деления для поиска минимума F(x) u t a a v u v r b b
Метод половинного деления для поиска минимума Ввод a, b, v=(a+b)/2 u=(b-a)/10 t=v-u; r=v+u f(t)>f(r) ДА НЕТ a=t ДА b=r |b-a| > НЕТ Вывод (a+b)/2
Метод половинного деления для поиска минимума double min 2(double a, double b, double eps, double (*w)(double)) { int m=10; double t, r, u, v; while(fabs(b-a)>eps) { u=(b-a)/m; v=. 5*(a+b); t=v-u; r=v+u; if(w(t)>w(r)) a=t; else b=r; } return. 5*(a+b); }
Метод золотого сечения L 1 L 2 L 1 F(x) q p p a 0 a q c d 0, 382 0, 618 c d b b 1
Метод золотого сечения
Метод золотого сечения double minzs(double a, double b, double eps, double (*f)(double)) { double c, d, p, q, k 1, k 2; k 1=. 5*(sqrt(5. 0)-1); k 2=1 -k 1; c=k 1*a+k 2*b; d=k 2*a+k 1*b; p=f(c); q=f(d); while(fabs(b-a)>eps) { if(p>q) {a=c; c=d; p=q; d=k 2*a+k 1*b; q=f(d); } else {b=d; d=c; q=p; c=k 1*a+k 2*b; p=f(c); } } return. 5*(a+b); }
Метод прямоугольников y 1 F(x) y. N a x 0 h h x 1 h h b x. N
Метод прямоугольников 18, 0878 26, 15625 2, 625 3 4 2, 625 6, 5917 1, 875 3 2, 25 1, 4238 1, 125 1, 5 2 1, 125 0, 0527 0, 75 0, 375 1 Yi Xi 0 i *0, 75= 19, 617
Метод трапеций y 1 y 0 F(x) y. N S=(y 0+y 1)*h/2 a x 0 h h x 1 h h b x. N
Метод трапеций i Xi Yi 0 0 0 1 0, 75 0, 421875 *1 2 1, 5 3, 375 *1 3 2, 25 11, 39063 *1 4 3 27 28, 6875 *1/2 *0, 75= 21, 515
Метод трапеций
Метод Симпсона y 1 y 2 y 0 Sпр=2*h*y 1 Sтр=h*(y 0+y 2) Sc=(2*Sпр+Sтр)/3= =(y 0+4*y 1+y 2)*h/3 x 0 h x 1 h x 2
Метод Симпсона y 1 y 0 y 2 F(x) S=(y 0+4 y 1+y 2)*h/3 a x 0 y. N h h x 1 h h b x. N
Метод Симпсона i Xi Yi 0 0 0 *1 1 0, 75 0, 421875 *4 2 1, 5 3, 375 *2 3 2, 25 11, 39063 *4 4 3 27 *1 81 *0, 75/3= 20, 25
Метод Симпсона
Метод трапеций с экономией вычислений Ввод a, b, n=2; S=10 25 S 0=(f(a)+f(b))/2 S 1=f((a+b)/2) Sn=S n=2 n h=(b-a)/n i=1 x=a+(2 i-1) h S 1=S 1+ f(x) i=n/2 S=(S 0+S 1) h ДА |S-Sn| > НЕТ Вывод S
Метод трапеций с экономией вычислений double trap(double a, double b, double eps, double (*f)(double)) { double h, s, s 0, s 1, sn; long n, i; s=1 e 25; sn=1; n=4; s 0=(f(a)+f(b))*. 5; s 1=f(. 5*(a+b)); while(fabs(s-sn)>eps) { sn=s; h=(b-a)/n; for(i=0; i<n/2; i++) s 1+=f(a+(2*i+1)*h); s=h*(s 0+s 1); n*=2; } return s; }
Метод Симпсона с экономией вычислений Ввод a, b, n=2; S 2=0; S=10 25 S 1=f(a)+f(b) S 4=f((a+b)/2) Sn=S; S 2=S 2+S 4 n=2 n; S 4=0 h=(b-a)/n i=1 x=a+(2 i-1) h S 4=S 4+f(x) i=n/2 S=(S 1+2 S 2+4 S 4) h/3 ДА |S-Sn| > НЕТ Вывод S
Метод Симпсона с экономией вычислений double Simpson(double a, double b, double eps, double(*w)(double)) { double h, sn, s 1, s 2, s 4, s; long n, i; n=2; s 1=w(a)+w(b); s 2=0; s 4=w(. 5*(a+b)); do{ sn=s; n*=2; s 2+=s 4; h=(b-a)/n; s 4=0; for(i=0; i<n/2; i++) s 4+=w(a+(2*i+1)*h); s=h/3*(s 1+2*s 2+4*s 4); }while(fabs(s-sn)>eps); return sn; } s=1 e 25;
Главная программа #include<stdio. h> #include<conio. h> #include<math. h> double Simpson(double, double(*)(double)); double f(double); main() { double s, a, b, eps; printf("n Задайте пределы интегрирования и точность: "); scanf("%lf%lf%lf", &a, &b, &eps); s=Simpson(a, b, eps, f); printf("n Интеграл от a=%3. 2 lf до b=%3. 2 lf равен %lf", a, b, s); getch(); } double f(double x) { return sin(x); }. . .
Метод Гаусса 1 121|4 223|7 321|6 223|7 121|4 3 1 0, 7 0, 3 | 2 0 0, 7 2, 3 | 3 0 1, 3 0, 7 | 2 4 1 0, 7 0, 3 | 2 0 1, 3 0, 7 | 2 0 0, 7 2, 3 | 3 Прямой ход 1. 2. 3. 4. ВГЭ в 1 -м столбце (1’)=(1) / 3 (2’)=(2)-(1’)*2 (3’)=(3)-(1’)*1 ВГЭ во 2 -м столбце (2’’)=(2’)/1, 3 (3’’) = (3’)-(2’’)*0, 7 Обратный ход X 3 = 2: 2 = 1 X 2 = 1, 5 – 0, 5*1 = 1 X 1 = 2 – 0. 7*1 – 0. 3*1 = 1 1 0, 7 0, 3 | 2 0 1 0, 5 | 1, 5 0 0 2 | 2
Метод Гаусса
Метод Гаусса (ВГЭ) gl_elem(double **a, int n, int k) { double r, *z; int i, j, m; printf("n ВГЭ при k=%dn", k); printf("n. До перестановкиn"); for(i=0; i<n; i++) { for(j=0; j<=n; j++) printf("%5. 1 f", a[i][j]); printf("n"); } printf("n"); r=fabs(a[k][k]); m=k; for(i=k+1; i<n; i++) { if(fabs(a[i][k])>r) { r=fabs(a[i][k]); m=i; } } if(m!=k) { z=a[k]; a[k]=a[m]; a[m]=z; } printf("n. После перестановкиn"); for(i=0; i<n; i++) { for(j=0; j<=n; j++) printf("%5. 1 f", a[i][j]); printf("n"); } printf("n"); getch(); }
Метод Гаусса #include <alloc. h> /* #include <malloc. h> для c++ */ #include <stdio. h> Gauss. dat #include <conio. h> #include <math. h> 3 main() 1 2 1 4 { double **a, r, *x; 2 2 3 7 int i, j, k, n; FILE *in; 3 2 1 6 in=fopen(”gauss. dat”, ”r”); fscanf(in, "%d", &n); x=(double*)malloc(n*sizeof(double)); a=(double**)malloc(n*sizeof(double*)); for(i=0; i<n; i++) a[i]=(double*)malloc((n+1)*sizeof(double)); for(i=0; i<n; i++) for(j=0; j<=n; j++) fscanf(in"%lf", &a[i][j]); fclose(in); for(k=0; k<n-1; k++) { gl_elem(a, n, k); r=a[k][k]; for(j=k; j<=n; j++) a[k][j]/=r; for(i=k+1; i<n; i++) { r=a[i][k]; for(j=k; j<=n; j++) a[i][j]-=a[k][j]*r; } } x[n-1]=a[n-1][n]/a[n-1]; for(k=n-2; k>=0; k - -) { x[k]=a[k][n]; for(j=k+1; j<n; j++) x[k]-=a[k][j]*x[j]; } for(i=0; i<n; i++) printf("nx[%d]=%f", i, x[i]); getch(); }
Метод Зейделя Условие сходимости Диагональное преобладание Ответ: 1, 2, 3 Максимальная невязка |1, 01 -1, 16|=0, 15
#include <stdio. h> #include <conio. h> #include <math. h> main() { int i, j, n=3; float a[3][3]= {4, 1, 1, 1, 6, -1, 1, 2, 5}; float b[3]={9, 10, 20}; float x[3]={0, 0, 0}, r, y, d, eps=0. 001; for(i=0; i<n; i++) { r=a[i][i]; b[i]/=r; for(j=0; j<n; j++) a[i][j]=-a[i][j]/r; a[i][i]=0; } do{ d=0; for(i=0; i<n; i++) { y=b[i]; for(j=0; j<n; j++) y+=a[i][j]*x[j]; d+=fabs(y-x[i]); x[i]=y; } } while (d>eps); printf("n. Решениеn"); for(i=0; i<3; i++) printf("nx[%d]=%5. 3 f", i+1, x[i]); getch(); }
Methods.ppt