Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_1-23.docx
Скачиваний:
17
Добавлен:
11.05.2015
Размер:
106.18 Кб
Скачать

11. Численное решение уравнения методом секущих. Эффективность данного алгоритма. Привести фрагмент программы, поясняющий данный алгоритм.

Алгоритм вроде такой же, как и в методе Ньютона, только сравниваем не так:

while (abs(f(x)) > epsilon)

А так:

while (abs(f(x)) < epsilon)

const double a = 0.0;

const double b = 1.0;

const double x0 = 0.5;

const double epsilon = 0.000001;

double f(double x)

{

return (x-0.25)*(x-0.25);

}

double df(double x)

{

return 2*x;

}

int main(int argc , char *argv[])

{

double x = x0;

while (abs(f(x)) < epsilon)

{

x = x - f(x)/df(x);

}

std::cout << x << std::endl;

}

12. Численное решение уравнения методом простых итераций. Эффективность данного алгоритма. Привести фрагмент программы, поясняющий данный алгоритм.

Применяется к уравнению вида x=u(x) на отрезке [a,b], где:

1. модуль производной функции u(x) невелик: |u’(x)|<=q<1 (x∈[a,b])

2. значения u(x) лежат на [a,b], т.е. a<=u(x)<=b при x∈[a,b].

Но так как мы точно знаем (из первого этапа решения задачи), что на этом отрезке есть корень, и он только один, то условие 2 можно опустить.

Сведение уравнения f(x)=0 к нужному виду обычно осуществляют так: выражают один из x, входящих в уравнение, например уравнение е^х-х-7=0 приводят к виду: x=е^x-7 или x=ln(x+7).

В первом случае |u’(x)|=|e^x| на левом конце отрезка (0) не меньше единицы, что не подходит по условию 1, во втором же случае |u’(x)|=|1/(x+7)| явно меньше единицы, что нас и устраивает.

Суть метода итераций заключается в построении рекуррентной последовательности чисел, сходящейся к решению, по формуле хк+1 = u(xк), к=0,1,2,…, где х0∈[a,b] -произвольная точка. Для удобства можно вводить х0=a.

#define TESTPRINT

double Equation( double x ) {

return pow( cos(x+0.5), (double)(1./3.) );

}

int main() {

const double eps = 0.0001;

double x0, x, xNext;

int nIter;

printf( "x0 = ? " ); scanf( "%lg", &x0 );

x = x0;

xNext = Equation( x );

nIter = 1;

while ( fabs( xNext-x ) > eps ) {

x = xNext;

xNext = Equation( x );

++nIter;

#ifdef TESTPRINT

printf( "%.5g %.5g %d\n", x, xNext, nIter );

#endif

}

printf( "The root %.5g has been reached to within %.5g after %d iterations.\n",

xNext, eps, nIter );

getch();

return 0;

}

13. Численное интегрирование методом прямоугольников. Эффективность данного алгоритма. Привести фрагмент программы, поясняющий данный алгоритм.

Метод прямоугольников — метод численного интегрирования функции одной переменной, заключающийся в замене подынтегральной функции на многочлен нулевой степени, то есть константу, на каждом элементарном отрезке. Если рассмотреть график подынтегральной функции, то метод будет заключаться в приближённом вычислении площади под графиком суммированием площадей конечного числа прямоугольников, ширина которых будет определяться расстоянием между соответствующими соседними узлами интегрирования, а высота — значением подынтегральной функции в этих узлах.

Левые прямоугольники

Средние прямоугольники

Правые прямоугольники

 

Пример для левых прямоугольников:

double f(double x){

return sin(x);

}

double rectangle_integrate(double a, double b, int n, double (*f)(double) ){

double result, h;

int i;

h = (b-a)/n;

result = 0.0;

for(i=0; i result += f( a + h * i );

}

result *= h;

return result;

}

int main(void){

double integral;

integral=rectangle_integrate(0,2,100,f);

printf("The value of the integral is: %lf \n", integral);

}

Пример для средних прямоугольников:

double f(double x){

return sin(x);

}

double rectangle_integrate(double a, double b, int n, double (*f)(double) ){

double result, h;

int i;

h = (b-a)/n;

result = 0.0;

for(i=1; i result += f( a + h * (i - 0.5) );

}

result *= h;

return result;

}

int main(void){

double integral;

integral=rectangle_integrate(0,2,100,f);

printf("The value of the integral is: %lf \n", integral);

}

Пример для правых прямоугольников:

double f(double x){

return sin(x);

}

double rectangle_integrate(double a, double b, int n, double (*f)(double) ){

double result, h;

int i;

h = (b-a)/n;

result = 0.0;

for(i=1; i result += f( a + h * i );

result *= h;

return result;

}

int main(void){

double integral;

integral=rectangle_integrate(0,2,100,f);

printf("The value of the integral is: %lf \n", integral);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]