Решение не линейных уравнений за численными методами - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д