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

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

30.12.2019, 04:11. Показов 1481. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2019, 04:11
Ответы с готовыми решениями:

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

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

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

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

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

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

PS. За логические спагетти с использованием goto - расстрелять.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.01.2020, 01:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер