Реферат Курсовая Конспект
II. Метод касательных. - раздел Информатика, Указатель на функцию Строится Последовательность Приближений К Корню X0 , X...
|
Строится последовательность приближений к корню
x0 , x1 , x2 ,. . . xn-1 , xn , xn+1 ,. . . .,
Где
x0 = α, если f(α) *f’’(α)>0
β, в противном случае
последовательность строится по формуле:
x n+1 = x n– f(xn) / f’ (xn)
Условие окончания: |xn+1- xn|< ε;
III. Метод хорд.
Строится последовательность приближений к корню
x0 , x1 , x2 ,. . . xn-1 , xn , xn+1 , . . . . . .
Где
x0= α, если f(α)*f’’(α)<0
β, в противном случае
последовательность строится по формуле:
xn+1=xn – * f(xn)
Условие окончания: |xn+1- xn|< ε;
Пример 1. Написать функцию для решения уравнения f(x)=0 методом касательных. Уравнение e-x-x = 0.
Требуется определить две функции для f (x) и f ’(x).
#include <iostream>
#include <cmath>
using namespace std;
double f (double x) {return exp(-x)-x;}
// значение функции f(x)
double f1(double x) {return (-exp(-x)-1); }
//значение производной f’(x)
typedef double (*TF) (double);
//TF тип указателя на функцию типа f и f1
double mettang (double x0, double eps, TF pf, TF pf1)
{ double x1, x2=x0;
do
{x1=x2;
x2=x1 – pf(x1)/ pf1(x1);
}while (fabs (x1- x2)>=eps);
return x2;
}
int main()
{ double x0,eps;
cout<<”--> x0, epsn”;
cin>> x0>> eps;
cout<<”корень=”<< mettang (x0, eps, f, f1) << ’n’;
return 0;
}
Пример 2. Вычислить приближённое значение определённого интеграла на заданном отрезке [a,b] от задаваемой функции f(x). Есть несколько способов:
a)Отрезок интегрирования [a,b] разбивается на N равных частей, шаг деления h=(b-a)/N, на каждом отрезке площадь заменяют прямоугольником с высотой, равной значению функции на левом, правом конце, либо трапецией с основаниями – значениями функции на концах, либо объединяют по два отрезка и заменяют кусочек функции параболой на этих отрезках. Соответственно получают формулы левых, правых прямоугольников, трапеций и парабол (Симпсона):
J(a,b,N,f(x))левых пр.= h*(f(a)+f(a+h)+ f(a+2*h)+……+f(a+(N-1)*h))
J(a,b,N,f(x))правых пр.= h*(f(a+h)+f(a+2*h)+ ……+f(a+(N-1)*h)+f(b))
J(a,b,N,f(x))трапеций= h/2*(f(a)+2*f(a+h)+ ……+2*f(a+(N-1)*h)+f(b))
J(a,b,N,f(x))парабол= h/3* (f(a)+4*f(a+h)+2*f(a+2*h) +4*f(a+3*h)
+2*f(a+4*h)+ ……+4*f(a+(N-1)*h)+f(b))
Значение интеграла получается с некоторой точностью, для достаточно гладкой функции f(x) этой точности часто хватает, если нет - можно увеличить N.
b)Задачу можно поставить и так: вычислить с заданной точностью eps приближённое значение интеграла на заданном отрезке [a,b] от задаваемой функции f(x). В этом случае строят последовательность приближённых значений интеграла, пока два соседние приближения не станут близки: |Jn+1-Jn |<eps.
Последовательные значения интеграла получаются по выбранной формуле для делений отрезка интегрирования на N, 2*N, 4*N,и т.д.
частей. В теории доказано, что для достаточно гладкой подинтегральной функции так построенная последовательность будет сходиться. Однако здесь есть одна особенность: увеличение точек деления отрезка каждый раз в 2 раза приводит к тому, что в новом делении присутствуют старые и новые точки деления, при вычислении очередной суммы значений подинтегральной функции это надо учитывать и вычислять её без пересчёта значений в старых точках. Это не сложно для формул левых, правых прямоугольников, трапеций, несколько сложнее для формулы парабол.
Рассмотрим формулу трапеций.
У
a a+h a+2h a+3h b X
h=(b-a)/N;
IN= h/2*(f(a)+f(b)+2*S); //S-сумма значений в средних точках
N1=2*N; h1=h/2;
I2N= h1/2*(f(a)+f(b)+2*(S+S’));//S’-сумма значений в новых точках
Поэтому новое приближение I2N надо вычислять так:
I2N = IN/2+ S'*h1; //без пересчёта значений в старых точках.
Для формулы Симпсона (N- чётное):
IN =h/3*(f(a)+4*f(a+h)+2*f(a+2*h) +
+4*f(a+3*h)+2*f(a+4*h)+ ……+4*f(a+(N-1)*h)+f(b))=
=S0 + 4*S1 + 2*S2;
где S0= h/3*(f(a)+f(b));
S1= h/3*(f(a+h)+f(a+3*h)+……f(a+(N-1)*h));
//сумма в ”нечётных” точках.
S2= h/3*(f(a+2*h)+f(a+4*h)+……f(a+(N-2)*h));
//сумма в ”чётных” точках.
N1=2*N; h1=h/2;
Для вычисления I2N надо пересчитать S0, S1, S2.
S0нов= S0/2 ; S2нов=(S1+S2)/2; //все точки старые.
S1нов=h1/3*(f(a+h1)+f(a+h1+h)+f(a+h1+2*h)+…+f(a+h1+2*(N1-1)*h)) //здесь все новые точки.
I2N =S0 нов +4* S1нов +2* S2нов ;
Пример программы для a)
#include <iostream>
using namespace std;
double f(double x)
{return x*x;}
//можно не опиcывать тип указателя на функцию
double metparabol(double a,double b,int n, double(*tf)(double))
{double h,x,s,e;
int k;
h=(b-a)/n;
s=h/3*(tf(a)+tf(b));
k=4; x=a+h; e=b-h/2;
while (x<e)
{s=s+k*tf(x)*h/3;
x=x+h; k=6-k;
}
return s;
}
int main ()
{double a,b;
int n;
cout<<"vvedite a,b,n n";
cin>>a>>b>>n;
cout<< metparabol(a,b,n,f)<<endl;
return 0; }
– Конец работы –
Эта тема принадлежит разделу:
Указатель на функцию... Указатель на функцию содержит адрес оперативной памяти по которому... для косвенного вызова функции т е не через е имя а через обращение к переменной хранящей е адрес...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: II. Метод касательных.
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов