Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 25.09.2019
Сообщений: 8
1

Программа для решение нелинейных уравнений

30.12.2019, 04:11. Показов 1450. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Программа должна находить корень уравнения на заданном пользователем промежутке одним из 2 методов на выбор пользователя - половинным делением или методом Ньютона. Моя прожка половинным делением считает без проблем, чего не скажешь о Ньютоне. Мне удалось определить, что проблема заключается в формуле производной - прога считает, что f(x)==f(x+a), тогда значение производной = 0, после мы ее подставляем в вычисление дельты, и программа ломается, тк на 0 делить нельзя. Что можно с этим сделать? Возможно есть еще какая-то ошибка, которую у меня не получилось обнаружить?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <stdio.h>
#include <math.h>
 
 double x, t, a, b, e, poh, delt; 
 
 double (*pfpr) (double, double);
 
 int m, s;
 char c;
 double z;
 
  
 double func1(double x, double t);
 double func2(double x, double t);
 double pol(double a, double b, double e);
 
 main(void) 
 {
    do
 {
   printf ("ENTER T: ");
   
   A:
    while (scanf("%lf%c", &t, &c)!=2||c!='\n')
    {
        printf ("DON'T USE SYMBOLS IN T. TRY AGAIN: ");
        fflush (stdin);
    }
    
    if (fabs(t)>=1000)
    {
        printf ("B IS TOO BIG (SMALL). TRY AGAIN: ");
        goto A;
    }
   
   Q:
   printf ("ENTER A (STARTING POINT): ");
   
   C:
   
   while (scanf("%lf%c", &a, &c)!=2||c!='\n')
    {
        printf ("DON'T USE SYMBOLS IN A. TRY AGAIN: ");
        fflush (stdin);
    }
    
    if (fabs(a)>=1000)
    {
        printf ("A IS TOO BIG (SMALL). TRY AGAIN: ");
        goto C;
    }
    
    
   printf ("ENTER B (ENDING POINT): ");
   
   D:
    while (scanf("%lf%c", &b, &c)!=2||c!='\n')
    {
        printf ("DON'T USE SYMBOLS IN B. TRY AGAIN: ");
        fflush (stdin);
    }
    
    if (fabs(b)>=1000)
    {
        printf ("B IS TOO BIG (SMALL). TRY AGAIN: ");
        goto D;
    }
   
   if (a>b)
   {
    printf ("B>A. TRY AGAIN: ");
    goto Q;
   }
   
   printf ("ENTER ACCURACY:\n");
    
    B:
    while (scanf("%lf%c", &e, &c)!=2||c!='\n')
    {
        printf ("DON'T USE SYMBOLS IN B. TRY AGAIN: ");
        fflush (stdin);
    }
    
    if (e>=1||e<1E-17)
    {
        printf ("B IS TOO BIG (SMALL). TRY AGAIN: ");
        goto B;
   }
   
   printf ("WHICH EQUATION DO YOU WANT TO COUNT? PRESS 1 UF THE FIRST PRESS 2 IF THE SECOND: ");
   
   while(scanf("%d%c", &m,&c)!=2||c!='\n'||m!=2&&m!=1)
{
    printf ("DON'T USE OTHER SYMBOLS IN THE MASSIVE. TRY AGAIN: ");
    fflush (stdin);
}
  
  printf ("WHICH WAY DO YOU WANT TO COUNT? PRESS 1 UF THE FIRST PRESS 2 IF THE SECOND: ");
  
   while(scanf("%d%c", &s,&c)!=2||c!='\n'||s!=2&&s!=1)
{
    printf ("DON'T USE OTHER SYMBOLS IN THE MASSIVE. TRY AGAIN: ");
    fflush (stdin);
}
 
 
 if (m==1)
    pfpr = func1;
   
 if (m==2)
    pfpr = func2;
 
  if (s==1)
  printf("X = %lf\n", pol(a, b, e));
 
  if (s==2)//метод ньютона
  {  
    x = b;
    
    z = 1e-15;  
  do 
{
    double q;
    q=pfpr(x+z, t);
    poh =(q-pfpr(x, t))/z;//ищем производную
     
    delt = pfpr(x,t)/poh;
    x- = delt;
       
    }while(delt>e);
    
 
    printf("poh = %lf\n", poh);
 }
 
 
   printf ("\nPRESS ESC TO EXIT. PRESS ANY KEY TO CONTINUE.\n");
   
} while (getch()!=27);
 }
 
 double pol(double a, double b, double e) //метод половинного деления
 {
    
    while (fabs (b - a)> e) 
   {
      x = (a + b) / 2;
      if (pfpr(a, t) *  pfpr(x, t)> 0)
         a = x;
      else
         b = x;
   }
   return x;
 }
 
 double func1(double x, double t)
 { 
   return (cos(t/x)-2*sin(1/x)+(1/x));
 }
 
 double func2(double x, double t)
 { 
   return (sin(log(x))-cos(log(x))+t*(log(x)));
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2019, 04:11
Ответы с готовыми решениями:

Решение нелинейных уравнений
Доброго времени суток,возникла проблемка с заданием, прошу вас помочь) A=0.195; B=0.12;...

Решение систем нелинейных уравнений.
Дана система уравнений: x=x^2-y^2+0.1 y=2xy+0.1 Решить методом простой итерации. вот что у...

Решение системы нелинейных уравнений.
Нужно решить систему уравнений, методом ньютона. Решаю задачу на СИ, все по блок схеме. Пересел с...

Решение избыточной системы нелинейных и трансцендентных уравнений обобщенным методом Ньютона
нужна помощь в написании программы на СИ, тема &quot;Решение избыточной системы нелинейных и...

1
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
02.01.2020, 01:21 2
Цитата Сообщение от bionic_shredder Посмотреть сообщение
прога считает, что <если> f(x)==f(x+a), тогда значение производной = 0
И правильно считает.

Для метода Ньютона необходимо, что бы на интервале поиска корня не было экстремумов. Т.е. надо закончить вычисления и выдать сообщение, что интервал задан некорректно.

Что-то аналогичное надо сделать и, в случае линейной функции, график которой параллелен оси абсцисс. Но в этом случае просто нет корней.

PS. За логические спагетти с использованием goto - расстрелять.
1
02.01.2020, 01:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2020, 01:21
Помогаю со студенческими работами здесь

Решение системы нелинейных уравнений (для двух уравнений)
Нужна написать программный модуль для решения систем неленейных уравнений методом ньютона и методом...

Ошибка в коде - неправильно считает программа. Решение системы нелинейных уравнений методом Ньютона
Я по ссылке http://www.teh nari.ru/f41/t79111/ нашел код как пример (пост №2). Сделал по аналогии,...

Решение системы нелинейных уравнений в Stata 13 для массива данных
Мне необходимо решить следующую задачку задачку в Stata 13 Имеется следующая система уравнений ...

Решение системы нелинейных уравнений 8 уравнений – 8 неизвестных переменных
Решаю систему нелинейных уравнений в символьном виде, решение выполняю с помощью математических...

Решение системы нелинейных уравнений 12 уравнений – 12 неизвестных переменных
мне надо решать такую задачу, помогите мне пожалуйста даны 12 уравнений 1/...

Численное решение нелинейных уравнений и обыкновенных дифференциальных уравнений
1. Численное решение нелинейных уравнений. Найти все корни уравнения f(x) на интервале от 0.9 до...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru