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

Нелинейное уравнение методом Ньютона

20.10.2021, 08:23. Показов 962. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Требовалось решить нелинейное уравнение методом Ньютона.
Дано уравнение и интервал нахождения корня

Написал программу, но хочу услышать мнение экспертов по поводу написания, правильно или нет? Замечания, рекомендации и пр.

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
#include <stdio.h>
#include <math.h>
 
//Объявляем функцию f(x)
double f(double x)
{
    double f;
    f = sqrt(x) + log(x) + sin(4 * x) - 2;
    return f;
}
 
//находим первую производную
double f1(double x)
{
    double f1;
    f1 = 4 * cos(4 * x) + 1/x + 1/(2 * sqrt(x));
    return f1;
}
 
//находим вторую производную
double f2(double x)
{
    double f2;
    f2 = -(16 * sin(4 * x) + pow(x, -2) + 1/(4 * pow(x, 3/2)));
    return f2;
}
 
//
void main() {
    system("chcp 1251");
    //объявляем переменные;
    //a и b - заданный интервал поиска корня;
    //x - искомы корень;
    //e - точность вычисления;
    //k - количество итераций поиска;
    double a, b, e, x;
    int k;
    a = 2.2;
    b = 2.8;
    e = 0.00001;
    printf("a = %f\n", a);
    printf("b = %f\n", b);
    printf("e = %f\n", e);
    if(f(a) * f2(a) > 0) {
        printf("Условие на сходимость выполнено для x = a = %f\n", a);
        x = a;
    }
    else {
        if(f(b) * f2(b) > 0) {
            printf("Условие на сходимость выполнено для x = b = %f\n", a);
            x = b;
        }
        else {
            printf("Условие на сходимость не выполнено\n");
            x = -10E10;
        }
    }
    if(x > -10E10) {
        k = 0;
        while(1) {
            x = x - f(x)/f1(x);
            k+=1;
            if(fabs(f(x)) < e)
            break;
        }
        printf("Корень x = %f\n", x);
        printf("Количество итерация k = %d\n", k);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2021, 08:23
Ответы с готовыми решениями:

Решить нелинейное уравнение методом хорд и методом простой итерации
Help, please, послезавтра сдавать лабу, а я не знаю как делать=( Нужно решить нелинейное уравнение методом хорд и методом простой...

Решить уравнение по заданной формуле методом хорд и модифицированным методом Ньютона
8. Решить уравнение 5sinx - x = 0 на отрезке с точностью E методом хорд и модифицированным методом Ньютона.

Уравнение методом Ньютона
Доброго времени суток, помогите пожалуйста, справиться с уравнением, которое нужно реализовать методом Ньютона. Есть уравнение, скрин...

5
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
20.10.2021, 09:30
Цитата Сообщение от duck_nukem Посмотреть сообщение
if(fabs(f(x)) < e)
Решается уравнение x=f(x),
поэтому надо:
C++
1
if(fabs(f(x)-x) < e)
И что за волшебное число -10E10 ?
1
Модератор
Эксперт CЭксперт С++
 Аватар для Volga_
5209 / 2927 / 1509
Регистрация: 14.12.2018
Сообщений: 5,267
Записей в блоге: 1
20.10.2021, 11:27
duck_nukem, это код Си или Си++ у вас ?
duck_nukem, просто делать Си++ и метод Ньютона как я знаю:
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
#include <iostream>
#include <cmath>
 
//Объявляем функцию f(x)
double f(double x)
{
    double f;
    f = sqrt(x) + log(x) + sin(4 * x) - 2;
    return f;
}
 
//находим первую производную
double f1(double x)
{
    double f1;
    f1 = 4 * cos(4 * x) + 1 / x + 1 / (2 * sqrt(x));
    return f1;
}
 
//
int main()
{
    system("chcp 1251");
    //объявляем переменные;
    //a и b - заданный интервал поиска корня;
    //x - искомы корень;
    //e - точность вычисления;
    //k - количество итераций поиска;
    double a = 2.2, b = 2.8, e = 1e-5;
    double x = (a + b) / 2;
 
    double err;
    int k = 0;
    do
    {
        double t = f(x) / f1(x);
        x -= t;
        err = fabs(t);
        k++;
    } while (err > e);
    std::cout << "Корень x = " << x << std::endl;
    std::cout << "Количество итерация k = " << k << std::endl;
    return 0;
}
Я знаю, что вы хотите находить значение инициализации корня уравнения, но я часто делаю с половиной интервала корня. т.е. x=(a+b)/2, и тогда не надо посмотреть 2-дифференциальной функции.

duck_nukem, в строке 24 у вас неправильное написание 3/2 внутрь функции pow(). Это должно быть 3.0/2, или 1.5, или 3/2.0. Потому что 3/2 всегда равно 1. В Си/Си++/Си# то инт делит на инт всегда инт.

Результат по моему коду: x = 2.48281 и k = 3. Попробуйте и проверьте их.
0
3 / 3 / 0
Регистрация: 23.08.2021
Сообщений: 71
20.10.2021, 18:49  [ТС]
проверил решение в стороннем онлайн-сервисе, корней в данном интервале нет

Добавлено через 28 секунд
Цитата Сообщение от Volga_ Посмотреть сообщение
это код Си или Си++ у вас ?
это С
0
Модератор
Эксперт CЭксперт С++
 Аватар для Volga_
5209 / 2927 / 1509
Регистрация: 14.12.2018
Сообщений: 5,267
Записей в блоге: 1
20.10.2021, 18:54
Цитата Сообщение от duck_nukem Посмотреть сообщение
корней в данном интервале нет
Почему нет ? Я вижу f(a)=f(2)=0.856614251 и f(b)=f(2.8)=-0.276238259; поэтому f(a).f(b)<0, т.е. в интервале [a, b] есть корень по теории !
0
3 / 3 / 0
Регистрация: 23.08.2021
Сообщений: 71
20.10.2021, 19:31  [ТС]
Цитата Сообщение от Volga_ Посмотреть сообщение
double x = (a + b) / 2;
почему это выражение заменяет вторую производную?
и что такое t?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.10.2021, 19:31
Помогаю со студенческими работами здесь

Решить уравнение методом Ньютона
Сделать уравнение методом Ньютона. Функцию передать как параметр с поддержкой указателя Уравнение - 0.1x2-xlnx=0 Отрезок содержащий...

Методом Ньютона решить линейное уравнение
Всем привет и хорошего настроения! Решаю вычмат. Методом Ньютона надо решить линейное уравненьице. Сам метод запроган. Хочу запрогать...

Сделать уравнение методом Ньютона. Функцию передать как параметр с поддержкой указателя
Уравнение - 0,1(x)^2-xlnx=0 Отрезок содержащий корень - Метод - Ньютона Значения корня с точность 10^-4 - 1,1183

Нелинейное уравнение
Доброго времени суток, форумчане. Помогите пожалуйста решить задачку: Найти все корни функции f(x) на интервале методом хорд с...

Нелинейное уравнение
Добрый день! помогите найти корень уравнения: 2,9x – x = 0 с точностью e = 10-6 при заданном значении начала отрезка а = 4. ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru