C++: Задачи armadillo: №1 Сравнить методы деления отрезка пополам, хорд, касательных и итераций.
реклама
Теперь время есть... Разрешение на публикацию этого материала было подтверждено.
ОТЧЁТ - это сборник задач с решениями. Задач, надо сказать, сложных, весьма разнообразных и интересных. Всего в ОТЧЁТЕ 21 задача. Графика публикации этих задач не будет, так как я скоро буду работать проводником пассажирских поездов ЖД РФ.
Любую запись на моей ПС можно без проблем найти в содержании ПС. В конце каждой записи есть ссылка на содержание ПС, которое обновляется по мере появления новых записей.
Начнём...
Задача №1
Сравнить методы деления отрезка пополам, хорд, касательных и итераций, поочерёдно используя их для решения одного и того же уравнения. Независимо от метода заканчивать построения, как только будет получено такое приближение X, для которого |f(x)| < e, e = 0.01;0.001;10-7. Для каждого из методов построить график изменения числа потребовавшихся приближений при переходе от одного значения e к другому (в файле). В качестве уравнения на котором производится сравнение методов, и отрезка, которому принадлежит корень, следует взять:
1) x^3 + x^2 – 3 = 0 [0.6;1.4].
2) x^5 + x - 0.2 = 0 [-0.9;1.1].
include<math.h>
#include<stdio.h>
#include<stdlib.h>
double f1(double x)
{
return x*x*x+x*x-3;
}
double deff1(double x)
{
return 3*x*x+2*x;
}
double f2(double x)
{
return sqrt(3/(x+1));
}
double half(double a,double b,double e,int *n);
double itr(double *a,double *b);
double hord(double a,double b,double e,int *n);
double def(double a,double b,double e,int *n);
double iter(double a,double b,double e,int *n);
void outrez(FILE *f,double *x,int *n,int c,char *str);
//******************************************************************
double half(double a,double b,double e,int *n)
{
double x;
*n=0;
do
{
x=(a+b)/2;
(*n)++;
if(f1(a)*f1(x)>=0)a=x;
else b=x;
}
while(fabs(f1(x))>e);
return x;
}
double itr(double *a,double *b)
{
double x=f1(*a)*(*a-*b)/(f1(*b)-f1(*a))+*a;
*a=(f1(x)*f1(*a)>=0)?x:*a,*b=(f1(x)*f1(*b)>=0)?x:*b;
return x;
}
double hord(double a,double b,double e,int *n)
{
*n=0;
while((*n)++,fabs(f1(itr(&a,&b)))>e);
return itr(&a,&b);
}
double def(double a,double b,double e,int *n)
{
double x=b;
*n=0;
do x=x-f1(x)/deff1(x),(*n)++;
while(fabs(f1(x))>e);
return x;
}
double iter(double a,double b,double e,int *n)
{
double x=b;
*n=0;
do x=f2(x),(*n)++;
while(fabs(f1(x))>e);
return x;
}
void outrez(FILE *f,double *x,int *n,int c,char *str)
{
int i,j;
double e=0.01;
fprintf(f,"\t%s\n",str);
fprintf(f,"eps=");
for(i=0;i<c;i++)
fprintf(f,"%12.7f",e),e*=0.1;
fprintf(f,"\n x =");
for(i=0;i<c;i++)
fprintf(f,"%12.7f",x[i]);
fprintf(f,"\n y =");
for(i=0;i<c;i++)
fprintf(f,"%12.8f",f1(x[i]));
fprintf(f,"\n n =");
for(i=0;i<c;i++)
fprintf(f,"%12d",n[i]);
fprintf(f,"\n\n^\nn\n");
for(i=n[c-1];i>0;i--)
{
fprintf(f,"|");
for(j=0;j<c;j++)
if(n[j]==i)fprintf(f,"<**********>");
else fprintf(f," ");
fprintf(f,"\n");
}
fprintf(f,
"+--------------------------------------------------------------------eps->");
fprintf(f,"\n\n");
}
//******************************************************************
void main()
{
FILE *f;
double a=0.6,b=1.4,e,x[6];
int n[6],i;
f=fopen("n1.out","w");
e=0.01;
for(i=0;i<6;i++)
x[i]=half(a,b,e,&n[i]),e*=0.1;
outrez(f,x,n,6,"Метод деления отрезка поплам");
e=0.01;
for(i=0;i<6;i++)
x[i]=hord(a,b,e,&n[i]),e*=0.1;
outrez(f,x,n,6,"Метод хорд");
e=0.01;
for(i=0;i<6;i++)
x[i]=def(a,b,e,&n[i]),e*=0.1;
outrez(f,x,n,6,"Метод касательных");
e=0.01;
for(i=0;i<6;i++)
x[i]=iter(a,b,e,&n[i]),e*=0.1;
outrez(f,x,n,6,"Метод итераций");
fclose(f);
}
n1.out: x^3 + x^2 – 3 = 0; [0.6;1.4]
Метод деления отрезка поплам
eps= 0.0100000 0.0010000 0.0001000 0.0000100 0.0000010 0.0000001
x = 1.1750000 1.1746094 1.1745605 1.1745605 1.1745594 1.1745594
y = 0.00285937 0.00032418 0.00000737 0.00000737 -0.00000005 -0.00000005
n = 5 11 14 14 21 21
^
n
| <**********><**********>
|
|
|
|
|
|
| <**********><**********>
|
|
| <**********>
|
|
|
|
|
|<**********>
|
|
|
|
+--------------------------------------------------------------------eps->
Метод хорд
eps= 0.0100000 0.0010000 0.0001000 0.0000100 0.0000010 0.0000001
x = 1.1745150 1.1745531 1.1745585 1.1745593 1.1745594 1.1745594
y = -0.00028823 -0.00004083 -0.00000578 -0.00000082 -0.00000012 -0.00000000
n = 4 5 6 7 8 10
^
n
| <**********>
|
| <**********>
| <**********>
| <**********>
| <**********>
|<**********>
|
|
|
+--------------------------------------------------------------------eps->
Метод касательных
eps= 0.0100000 0.0010000 0.0001000 0.0000100 0.0000010 0.0000001
x = 1.1751350 1.1745596 1.1745596 1.1745596 1.1745594 1.1745594
y = 0.00373565 0.00000150 0.00000150 0.00000150 0.00000000 0.00000000
n = 2 3 3 3 4 4
^
n
| <**********><**********>
| <**********><**********><**********>
|<**********>
|
+--------------------------------------------------------------------eps->
Метод итераций
eps= 0.0100000 0.0010000 0.0001000 0.0000100 0.0000010 0.0000001
x = 1.1756906 1.1746419 1.1745654 1.1745598 1.1745593 1.1745594
y = 0.00734485 0.00053517 0.00003903 0.00000285 -0.00000077 -0.00000006
n = 4 6 8 10 11 13
^
n
| <**********>
|
| <**********>
| <**********>
|
| <**********>
|
| <**********>
|
|<**********>
|
|
|
+--------------------------------------------------------------------eps->
n2.out: x^5 + x - 0.2 = 0; [-0.9;1.1]
Метод деления отрезка поплам
eps= 0.0100000 0.0010000 0.0001000 0.0000100 0.0000010 0.0000001
x = 0.1937500 0.1996094 0.1996094 0.1996857 0.1996819 0.1996826
y = -0.00597697 -0.00007374 -0.00007374 0.00000316 -0.00000068 0.00000004
n = 6 10 10 17 19 23
+------------------------------------------n->
|****** 6
|********** 10
|********** 10
|***************** 17
|******************* 19
|*********************** 23
e
p
s
Метод хорд
реклама
eps= 0.0100000 0.0010000 0.0001000 0.0000100 0.0000010 0.0000001
x = 0.1934048 0.1992595 0.1996376 0.1996778 0.1996820 0.1996825
y = -0.00632460 -0.00042639 -0.00004524 -0.00000480 -0.00000051 -0.00000005
n = 8 14 19 24 29 34
+------------------------------------------n->
|******** 8
|************** 14
|******************* 19
|************************ 24
|***************************** 29
|********************************** 34
e
p
s
Метод касательных
eps= 0.0100000 0.0010000 0.0001000 0.0000100 0.0000010 0.0000001
x = 0.1999257 0.1999257 0.1996825 0.1996825 0.1996825 0.1996825
y = 0.00024515 0.00024515 0.00000000 0.00000000 0.00000000 0.00000000
n = 4 4 5 5 5 5
+------------------------------------------n->
|**** 4
|**** 4
|***** 5
|***** 5
|***** 5
|***** 5
e
p
s
Метод итераций
eps= 0.0100000 0.0010000 0.0001000 0.0000100 0.0000010 0.0000001
x = 0.1999913 0.1999913 0.1996806 0.1996806 0.1996825 0.1996825
y = 0.00031125 0.00031125 -0.00000198 -0.00000198 0.00000001 0.00000001
n = 2 2 3 3 4 4
+------------------------------------------n->
|** 2
|** 2
|*** 3
|*** 3
|**** 4
|**** 4
e
p
s
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают