- •1. Решение систем линейных алгебраических уравнений (слау)
- •Решение:
- •2.Аппроксимация функций
- •Решение:
- •3. Вычисление производных и интегралов
- •Решение:
- •4. Методы решения нелинейных уравнений
- •Решение:
- •5. Методы нахождения минимума функции одной переменной
- •Решение:
- •6. Решение задачи Коши для обыкновенных дифференциальных уравнений Варианты заданий
3. Вычисление производных и интегралов
Задан интервал [a, b], функция f(x) и указан метод вычисления интеграла. Вначале вычислить точные выражения для первой, второй производных , и для интеграла. Составить программу, которая вычисляет таблицу значений функции, ее точных и приближенных производных в точках а также точное и приближенное значения интеграла. Расчеты производной произвести для hp =0.2, 0.1 и 0.05. Расчеты интеграла произвести для m=10, 20 и 40 с точностью =0.001.
N |
Функция f(x) |
Интервал |
Метод интегрирования |
Значение
|
|
a |
b |
||||
5 |
|
5 |
8 |
Гаусса 2 |
6.067 |
Решение:
Фрагмент программы приведен в листинге 3.1.
Результаты работы программы приведены на рис. 3.1.
Листинг 3.1
double Gauss2(double a1,double b1,double m1)
{
double s=0,sm=0,h4=0,xi0,xi1,xi2;
int im;
h4=(b1-a1)/m1;
xi0=a1+h4/2;
xi1=xi0-(h4/2)*0.5773502692;
xi2=xi0+(h4/2)*0.5773502692;
for(im=1;im<=m1;im++)
{
sm=sm+yx(xi1)+yx(xi2);
xi0=xi0+h4;
xi1=xi0-(h4/2)*0.5773502692;
xi2=xi0+(h4/2)*0.5773502692;
}
s=(h4/2)*sm;
return s;
}
int main()
{
cout<<"x\t"<<"y\t"<<"D1T\t"<<"D1\t"<<"D2T\t"
<<"D2\t"<<"del1\t"<<"del2\t"<<endl;
for(j=1;j<=21;j++)
{
x=a+(j-1)*(b-a)/20;
y=yx(x);
d1=D1F(x,h);
d2=D2F(x,h);
d1t=1/(2*pow(x,0.5))+2*sin(x)*cos(x);
del1=fabs(d1t-d1);
d2t=-1/(4*pow(x,1.5))-2*pow(sin(x),2)+2*pow(cos(x),2);
del2=fabs(d2t-d2);
cout<<x<<"\t"<<fixed<<setprecision(3)<<y<<"\t"<<d1t<<"\t"<<
d1<<"\t"<<d2t<<"\t"<<d2<<"\t"<<del1<<"\t"<<del2<<endl;
}
t=Gauss2(a,b,m);
eps=fabs(itg-t);
cout<<"Integral: "<<t<<endl<<"Error: "<<eps<<endl;
return 0;
}
Рис. 3.1
4. Методы решения нелинейных уравнений
Отладить программу определения всех корней функции f(x) в указанном интервале [a, b], использовать метод в соотвествии с полученным вариантом из табл. 5.1.
Программа работает следующим образом: сначала на экран выдается таблица значений функции и делается запрос на ввод начального приближения (это может быть , или x0) к тому корню, который надо получить с заданной точностью. После того как введены требуемые данные, идет обращение к подпрограмме и печать результатов.
N |
f(x) |
Интервал |
метод |
|
а |
b |
|||
5 |
|
4 |
8 |
MP |
Решение:
Фрагмент программы приведен в листинге 4.1.
Результаты работы программы приведены на рис. 4.1-4.2.
Листинг 4.1
double MP(double x0,double h1)
{
double eps=0.0001,x1,x2,x3,r,d,p,q,D,cc;
double z[3]={0,0,0};
double y[4]={0,0,0,0};
double zm[3]={0,0,0};
int it,s;
x1=x0-h1;
x2=x0;
x3=x0+h1;
y[1]=countF(x1);
y[2]=countF(x2);
y[3]=countF(x3);
it=0;
do
{
it=it+1;
z[1]=x1-x3;
z[2]=x2-x3;
r=y[3];
d=z[1]*z[2]*(z[1]-z[2]);
p=((y[1]-y[3])*z[2]-(y[2]-y[3])/z[1])/d;
q=-((y[1]-y[3])*pow(z[2],2)-(y[2]-y[3])*pow(z[1],2))/d;
cc=fabs(pow(q,2)-4*p*r);
D=pow(cc,0.5);
zm[1]=(-q+D)/(p*2);
zm[2]=(-q-D)/(p*2);
if(fabs(zm[1])<fabs(zm[2]))
zm[0]=fabs(zm[1]);
else
zm[0]=fabs(zm[2]);
x1=x2;
x2=x3;
y[1]=y[2];
y[2]=y[3];
x3=x3+zm[0];
y[3]=countF(x3);
s=0;
if(fabs(zm[0])<eps)
s=1;
if(it>100)
s=1;
}
while(s!=1);
return x3;
}
double a=4;
double b=8;
int m=50;
int temp;
double x,y,h,xa,z;
int main()
{
h=(b-a)/m;
x=a;
while(x<=b)
{
y=countF(x);
cout << fixed << x << "\t" << y << endl;
x=x+h;
}
do
{
cout<<endl<<"Enter x0: ";
cin>>xa;
cout<<endl;
z=MP(xa,h);
cout << "Solution: "<<z<<endl;
temp=0;
cout<<"Find more radicals? "<<endl<<"'0'-YES"<<endl<<"'1'-NO"<<endl;
cin>>temp;
}
while(temp!=1);
return 0;
}
Рис. 4.1
Рис. 4.2