Решение не линейных уравнений за численными методами - 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;
    }
}

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

  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
Похожие ответы