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