Решение не линейных уравнений за численными методами - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста написать программу на языке Си.

Задание:

1. Решить нелинейное уравнение с точностью 0,1% по методам: - половинного деления; - простой итерации; - хорд; - Ньютона; - Рафсона.

уравнение

: x+Cosx=1
И ещё к этому же :Сравнить эффективность каждого метода по затратам времени

Решение задачи: «Решение не линейных уравнений за численными методами»

textual
Листинг программы
  1. # include <stdio.h>
  2. # include <math.h>
  3. # include <stdlib.h>
  4. # include <time.h>
  5. # include <sys/time.h>
  6. # define eps 0.001
  7. # define E 2.71
  8. # define n 100000
  9.  
  10. Функція знаходження розв’язку рівняння:
  11.  
  12. double Func(double x){
  13.     return (x-1)*(x-1)-0.5*pow(E,x);
  14. }
  15.  
  16. Диференціал функції знаходження розв’язку рівняння:
  17.  
  18. double dFunc(double x){
  19.     return 2*(x-1)-0.5*pow(E,x);
  20. }
  21.  
  22. Ітератор функції знаходження розв’язку рівняння:
  23.  
  24. double iFunc(double x){
  25.     return 0.5*(0.5*pow(E,x)-x*x);
  26. }
  27.  
  28. Метод половинного поділу:
  29.  
  30. double PolovPodil(double a, double b){
  31.     double x;
  32.     int i;
  33.     for (i=0;i<n;i++)
  34.         do{
  35.             x=(a+b)/2;
  36.             if (Func(x)*Func(a)>0) a=x;
  37.             else b=x;
  38.         } while (((a-b)/2)>eps);
  39.     return x;
  40. }
  41.  
  42. Метод хорд:
  43.  
  44. double Hordy(double a, double b){
  45.     double x=a,xn;
  46.     int i;
  47.     for (i=0;i<n;i++)
  48.         do{
  49.             xn=x;
  50.             x=a-((b-a)/(Func(b)-Func(a)))*Func(a);
  51.             if (Func(x)*Func(a)>0) a=x;
  52.             else b=x;
  53.         } while (abs(x-xn)>eps);
  54.     return xn;
  55. }
  56.  
  57. Метод Ньютона:
  58.  
  59. double Newton(double a, double b){
  60.     double x,xn;
  61.     x=(a+b)/2;
  62.     int i;
  63.     for (i=0;i<n;i++)
  64.         do{
  65.             xn=x;
  66.             x=xn-Func(xn)/dFunc(xn);
  67.             if (Func(a)*Func(x)>0) a=x;
  68.             else b = x;
  69.         } while (abs(x-xn)>eps);
  70.     return x;
  71. }
  72.  
  73. Метод Ньютона-Рафсона:
  74.  
  75. double NewtonRafson(double a){
  76.     double x=a;
  77.     int i;
  78.     for (i=0;i<n;i++)
  79.         do{
  80.             x=x-Func(x)/dFunc(x);
  81.         } while (Func(x)>eps);
  82.     return x;
  83.     }
  84.  
  85.  
  86. Метод простої ітерації:
  87.  
  88. double Iteration(double a){
  89.     double x=a,xn;
  90.     int i;
  91.     for (i=0;i<n;i++)
  92.         do{
  93.             xn=x;
  94.             x=iFunc(xn);
  95.         } while (abs(x-xn)>eps);
  96.     return x;
  97. }
  98.  
  99. Головна програма:
  100.  
  101. void main(){
  102.     double a=-100.0,b=0.0,h=0.5;
  103.     clock_t timer;
  104.     while (a<=100){
  105.         b=a+h;
  106.         if (Func(a)*Func(b)<0){
  107.             timer=clock();
  108.             printf("PolovPodil: %g\n",PolovPodil(a,b));
  109.             timer=clock()-timer;
  110.             printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
  111.             timer=clock();
  112.             printf("Hordy: %g\n",Hordy(a,b));
  113.             timer=clock()-timer;
  114.             printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
  115.             timer=clock();
  116.             printf("Newton: %g\n",Newton(a,b));
  117.             timer=clock()-timer;
  118.             printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
  119.             timer=clock();
  120.             printf("NewtonRafson: %g\n",NewtonRafson(a));
  121.             timer=clock()-timer;
  122.             printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
  123.             timer=clock();
  124.             printf("Iteration: %g\n",Iteration(a));
  125.             timer=clock()-timer;
  126.             printf("Processing (100000 times) time is: %.4f seconds\n",(double)timer/CLK_TCK);
  127.            
  128.         }
  129.         a=b;
  130.     }
  131. }

Объяснение кода листинга программы

  1. Объявлены функции: Func, dFunc, iFunc, PolovPodil, Hordy, Newton, NewtonRafson, Iteration.
  2. В функции main объявлены переменные a, b, h, timer.
  3. В цикле while перебираются значения a от -100.0 до 100.0 с шагом h.
  4. При каждом значении 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 и время выполнения.
  5. Значение a увеличивается на h после каждой итерации.
  6. Если Func(a) и Func(b) имеют разные знаки, то выполняется тело цикла.
  7. Значение b устанавливается равным a+h.
  8. Значение a устанавливается равным b.
  9. Цикл выполняется до тех пор, пока a меньше или равно 100.0.
  10. Значение h равно 0.5.
  11. В функции PolovPodil используется метод половинного деления для поиска корня.
  12. В функции Hordy используется метод хорд для поиска корня.
  13. В функции Newton используется метод Ньютона для поиска корня.
  14. В функции NewtonRafson используется метод Ньютона-Рафсона для поиска корня.
  15. В функции Iteration используется метод простой итерации для поиска корня.
  16. В функции Func вычисляется значение функции F(x).
  17. В функции dFunc вычисляется значение производной функции F(x).
  18. В функции iFunc вычисляется значение функции iF(x).
  19. В функции PolovPodil выполняется итеративный процесс, пока разница между a и b больше заданной точности eps.
  20. В функции Hordy выполняется итеративный процесс, пока разница между текущим и предыдущим значением x больше заданной точности eps.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы