Решение не линейных уравнений за численными методами - C (СИ)
Формулировка задачи:
Помогите пожалуйста написать программу на языке Си.
Задание:
1. Решить нелинейное уравнение с точностью 0,1% по методам: - половинного деления; - простой итерации; - хорд; - Ньютона; - Рафсона.уравнение
: x+Cosx=1
И ещё к этому же :Сравнить эффективность каждого метода по затратам времени
Решение задачи: «Решение не линейных уравнений за численными методами»
textual
Листинг программы
# include <stdio.h>
# include <math.h>
# include <stdlib.h>
# include <time.h>
# include <sys/time.h>
# define eps 0.001
# define E 2.71
# define n 100000
Функція знаходження розв’язку рівняння:
double Func(double x){
return (x-1)*(x-1)-0.5*pow(E,x);
}
Диференціал функції знаходження розв’язку рівняння:
double dFunc(double x){
return 2*(x-1)-0.5*pow(E,x);
}
Ітератор функції знаходження розв’язку рівняння:
double iFunc(double x){
return 0.5*(0.5*pow(E,x)-x*x);
}
Метод половинного поділу:
double PolovPodil(double a, double b){
double x;
int i;
for (i=0;i<n;i++)
do{
x=(a+b)/2;
if (Func(x)*Func(a)>0) a=x;
else b=x;
} while (((a-b)/2)>eps);
return x;
}
Метод хорд:
double Hordy(double a, double b){
double x=a,xn;
int i;
for (i=0;i<n;i++)
do{
xn=x;
x=a-((b-a)/(Func(b)-Func(a)))*Func(a);
if (Func(x)*Func(a)>0) a=x;
else b=x;
} while (abs(x-xn)>eps);
return xn;
}
Метод Ньютона:
double Newton(double a, double b){
double x,xn;
x=(a+b)/2;
int i;
for (i=0;i<n;i++)
do{
xn=x;
x=xn-Func(xn)/dFunc(xn);
if (Func(a)*Func(x)>0) a=x;
else b = x;
} while (abs(x-xn)>eps);
return x;
}
Метод Ньютона-Рафсона:
double NewtonRafson(double a){
double x=a;
int i;
for (i=0;i<n;i++)
do{
x=x-Func(x)/dFunc(x);
} while (Func(x)>eps);
return x;
}
Метод простої ітерації:
double Iteration(double a){
double x=a,xn;
int i;
for (i=0;i<n;i++)
do{
xn=x;
x=iFunc(xn);
} while (abs(x-xn)>eps);
return x;
}
Головна програма:
void main(){
double a=-100.0,b=0.0,h=0.5;
clock_t timer;
while (a<=100){
b=a+h;
if (Func(a)*Func(b)<0){
timer=clock();
printf("PolovPodil: %g\n",PolovPodil(a,b));
timer=clock()-timer;
printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
timer=clock();
printf("Hordy: %g\n",Hordy(a,b));
timer=clock()-timer;
printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
timer=clock();
printf("Newton: %g\n",Newton(a,b));
timer=clock()-timer;
printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
timer=clock();
printf("NewtonRafson: %g\n",NewtonRafson(a));
timer=clock()-timer;
printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
timer=clock();
printf("Iteration: %g\n",Iteration(a));
timer=clock()-timer;
printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
}
a=b;
}
}
Объяснение кода листинга программы
- Объявлены функции:
Func,dFunc,iFunc,PolovPodil,Hordy,Newton,NewtonRafson,Iteration. - В функции
mainобъявлены переменныеa,b,h,timer. - В цикле
whileперебираются значенияaот -100.0 до 100.0 с шагомh. - При каждом значении
aвыполняется:- Вызывается функция
PolovPodilс аргументамиa,b. - Вычисляется время выполнения 100000 итераций метода
PolovPodilс помощьюclock(). - Выводится результат вычисления
PolovPodilи время выполнения. - Вызывается функция
Hordyс аргументамиa,b. - Вычисляется время выполнения 100000 итераций метода
Hordyс помощьюclock(). - Выводится результат вычисления
Hordyи время выполнения. - Вызывается функция
Newtonс аргументамиa,b. - Вычисляется время выполнения 100000 итераций метода
Newtonс помощьюclock(). - Выводится результат вычисления
Newtonи время выполнения. - Вызывается функция
NewtonRafsonс аргументомa. - Вычисляется время выполнения вычисления
NewtonRafsonс помощьюclock(). - Выводится результат вычисления
NewtonRafsonи время выполнения. - Вызывается функция
Iterationс аргументомa. - Вычисляется время выполнения 100000 итераций метода
Iterationс помощьюclock(). - Выводится результат вычисления
Iterationи время выполнения.
- Вызывается функция
- Значение
aувеличивается наhпосле каждой итерации. - Если
Func(a)иFunc(b)имеют разные знаки, то выполняется тело цикла. - Значение
bустанавливается равнымa+h. - Значение
aустанавливается равнымb. - Цикл выполняется до тех пор, пока
aменьше или равно 100.0. - Значение
hравно 0.5. - В функции
PolovPodilиспользуется метод половинного деления для поиска корня. - В функции
Hordyиспользуется метод хорд для поиска корня. - В функции
Newtonиспользуется метод Ньютона для поиска корня. - В функции
NewtonRafsonиспользуется метод Ньютона-Рафсона для поиска корня. - В функции
Iterationиспользуется метод простой итерации для поиска корня. - В функции
Funcвычисляется значение функцииF(x). - В функции
dFuncвычисляется значение производной функцииF(x). - В функции
iFuncвычисляется значение функцииiF(x). - В функции
PolovPodilвыполняется итеративный процесс, пока разница междуaиbбольше заданной точностиeps. - В функции
Hordyвыполняется итеративный процесс, пока разница между текущим и предыдущим значениемxбольше заданной точностиeps.