- •Сравнение естественного и стандартного чисел обусловленности матрицы а также - точного значения стандартного числа обусловленности с его оценкой, вычисленной процедурой decomp:
- •Исследовать возможность улучшения обусловленности задачи посредством внесения малого случайного возмущения в матрицу системы.
- •7 Повторить эксперимент п.6 для 2-3 задач с плохо обусловленной матрицей.
- •8 Выполняя п.П. 6 и 7 , исследовать работоспособность различных методов оценки ошибок решения ( выражения (7), (12), (13) ) при наличии возмущения левой части системы.
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные данные:
- •Исходные данные:
- •Провести исследование влияния вида доминирования матрицы задачи на сходимость процедур Якоби и Гаусса-Зейделя.
- •Исходные данные:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исследовать устойчивость решения задачи среднеквадратичного приближения к погрешности исходных данных.
- •Исходные параметры:
- •Убедиться в справедливости условий чебышевского интерполирования.
- •Исходные параметры:
- •При интегрировании нескольких систем нелинейных уравнений обратить внимание на эффективность различных методов реализации схемы прогноз-коррекция.
- •Исходные параметры:
- •Исходные параметры:
- •При интегрировании жёстких задач:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Исходные параметры:
- •Дополнительное исследование метода релаксации:
Дополнительное исследование метода релаксации:
изменим параметр релаксации:
-
Параметр релаксации
Число итераций
Расх*
57
7
5
4
3
4
4
3
6
9
24
Расх**
* - превысил значение, при котором метод ещё сходится
**- совпало по знаку с .
ИТОГО: наименьшее количество итераций для метода релаксации: i=3 при . Трудоёмкость процесса при этом S=5.
Выводы: трудоёмкость ньютоновского процесса на каждом шаге в два раза выше, чем в остальных методах, ибо метод помимо вычисления функции предполагает вычисление производной. Таким образом, при одинаковом объёме вычислений методы секущих и релаксации могут сделать больше итераций, чем метод Ньютона, а, следовательно, и получить более высокую точность. Стоит также отметить, что оптимальное значение параметра релаксации не предоставило минимума числа итераций для метода релаксации: минимальное значение числа итераций было достигнуто при отклонении от (при этом значение числа итераций метода релаксации было меньше, чем соответствующее значение для метода Ньютона). Это объясняется тем, что оптимальное значение параметра релаксации вычисляется на интервале монотонности производной функции; в данном случае таких интервала два: и . Этим же объясняется и тот факт, что при некоторых значениях параметра релаксации, при которых , метод ещё сходится. Таким образом, при данных исходных условиях наиболее экономичным как в плане трудоёмкости, так и в плане числа минимума итераций, является метод релаксации.
Листинг:
1) Метод релаксации:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <conio.h>
#include <math.h>
using namespace std;
ofstream of1("Rout.txt");
ofstream of2("Rout2.txt");
double f(double x){return (x*x*x-0.1*x*x+0.3*x-0.6);}
double derivef(double x){return (3*x*x-0.2*x+0.3);}
double scndderivef(double x){return (6*x-0.2);}
int main(){
int S=0 , Iter=0;
double m1=derivef(0.5) , sol=0.75507187112752851702;
double M1=derivef(1) , t=-2/(m1+M1);
double x0=0.5 , eps=0.00001 , xa , xb;
S=S+2; //Дважды посчитали производную для поиска m1 и M1
xa=x0; xb=x0;
while(fabs(xb-sol)>=eps){
Iter=Iter+1; S=S+1;
xb=xa+t*f(xa);
cout<<S;
of1<<setw(8)<<xa<<endl;
of2<<setw(8)<<f(xa)<<endl;
xa=xb;
}
of1<<xb<<endl<<"The laboriousness S="<<S;
of2<<f(xb)<<endl<<"The laboriousness S="<<S;
cout<<"x*="<<xb<<" Iter="<<Iter;
cout<<" S="<<S<<"\nAll done”;
getch();
return 0;
}
2) Метод секущих:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <conio.h>
#include <math.h>
using namespace std;
ofstream of1("Sout.txt");
ofstream of2("Sout2.txt");
double f(double x){return (x*x*x-0.1*x*x+0.3*x-0.6);}
double derivef(double x){return (3*x*x-0.2*x+0.3);}
double scndderivef(double x){return (6*x-0.2);}
int main(){
int S=0 , Iter=0;
double sol=0.75507187112752851702;
double x0=0.5 , eps=0.00001 , x1=1;
double xa , xb , xc=999 , xcontr , flast;
xa=x0;
if(fabs(xa-sol)<eps){
of1<<x0;
of2<<f(x0);
return 0;
}
of1<<xa<<endl;
of2<<f(xa)<<endl;
xb=x1;
if(fabs(xb-sol)<eps){
of1<<x1;
of2<<f(x1);
return 0;
}
of1<<xb<<endl;
of2<<f(xb)<<endl;
flast=f(x0); S=S+1;
if(fabs((xb-f(xb)*(xb-xa)/(f(xb)-flast))-sol)<eps){
S=S+1;
of1<<xb-f(xb)*(xb-xa)/(f(xb)-flast);
of2<<f(xb-f(xb)*(xb-xa)/(f(xb)-flast));
return 0;
}
while(fabs(xc-sol)>=eps){
Iter=Iter+1; S=S+1;
xc=xb-f(xb)*(xb-xa)/(f(xb)-flast);
if(fabs(xc-xb)/fabs(xb-xa)>1)
xcontr=xc;
of1<<xc<<endl;
of2<<f(xc)<<endl;
xa=xb; xb=xc;
flast=f(xa);
}
if(fabs(xcontr-sol)<=fabs(xc-sol)){
xc=xcontr;
of1<<"Warning! New xc="<<xc<<endl;
of2<<"Warning! New f(xc)="<<f(xc)<<endl;
}
of1<<"The laboriousness S="<<S;
of2<<"The laboriousness S="<<S;
cout<<"x*="<<xc<<" Iter="<<Iter<<" S="<<S<<"\nAll done";
getch();
return 0;
}
2) Метод Ньютона:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <conio.h>
#include <math.h>
using namespace std;
ofstream of1("Nout.txt");
ofstream of2("Nout2.txt");
double f(double x){return (x*x*x-0.1*x*x+0.3*x-0.6);}
double derivef(double x){return (3*x*x-0.2*x+0.3);}
double scndderivef(double x){return (6*x-0.2);}
int main(){
int S=0 , Iter=0;
double sol=0.75507187112752851702 , m1=derivef(0.5) , M2=scndderivef(1);
double x0=0.5 , eps=0.00001 , xa , xb;
cout<<M2/(2*m1)*fabs(x0-sol)<<endl;
xa=x0; xb=x0;
while(fabs(xb-sol)>=eps){
Iter=Iter+1; S=S+2;
xb=xa-f(xa)/(derivef(xa));
of1<<xa<<endl;
of2<<f(xa)<<endl;
xa=xb;
}
of1<<xb<<endl<<"The laboriousness S="<<S;
of2<<f(xb)<<endl<<"The laboriousness S="<<S;
cout<<"x*="<<xb<<" Iter="<<Iter<<" S="<<S<<"\nAll done";
getch();
return 0;
}