Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
#1

Решение СНАУ методом Ньютона - C++

29.07.2014, 18:19. Просмотров 1831. Ответов 25
Метки нет (Все метки)

Нужно написать программу для решения систем нелинейных алгебраических уравнений методом Ньютона. Наибольшая сложность заключается в том что на время запуска программы не ясно сколько будет этих уравнений и сколько будет неизвестных. Сам метод Ньютона я понимаю, а вот как это всё реализовать слабо представляю, так как с программированием знаком поскольку-постольку, а программа нужна для научной работы совсем по другой специальности)) Можете подсказать хоть общий план действий, с чего начать... и если есть что-то подобное, поделиться хоть какими-то исходниками) Заранее спасибо)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2014, 18:19     Решение СНАУ методом Ньютона
Посмотрите здесь:

Решение квадратного уравнения методом Ньютона C++
C++ Вычисление определенного интеграла и решение уравнений методом Ньютона.
Курсовая работа "Решение систем нелинейных уравнений Методом Ньютона" C++
C++ Решение СНАУ методом Ньютона
Метод Ньютона в решении СНАУ C++
Решение системы нелинейныз алгебраических уравнений методом Ньютона (2 уравнения) C++
C++ Написать решение СНУ Методом Ньютона
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Иванов_Андрей
10 / 10 / 0
Регистрация: 23.07.2014
Сообщений: 52
29.07.2014, 18:48     Решение СНАУ методом Ньютона #2
dfg, ТЗ четкое есть?
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 19:58  [ТС]     Решение СНАУ методом Ньютона #3
В консоли пользователь вводит систему нелинейных уравнений и относительную погрешность, вектор начальных приближений должен состоять из нулей. Ну вот собственно и всё ТЗ)
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
29.07.2014, 19:59     Решение СНАУ методом Ньютона #4
Вообще вам надо в раздел фриланс

Меня смущает требование
Цитата Сообщение от dfg Посмотреть сообщение
В консоли пользователь вводит систему нелинейных уравнений
Это прям целый парсер писать. Особенно если разрешить использовать всякие синусы.
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 20:07  [ТС]     Решение СНАУ методом Ньютона #5
Я так понимаю, что уравнения пользователь должен вводить в виде строки, а потом эти строки должны с помощью парсинга ложиться в динамический массив. Далее по конечно-разностному методу находится производные из которых формироваться матрица Якоби - двухмерный динамический массив. Ну и каким-то методом, скажем Крамера, находиться корни уже линейных уравнений.

Добавлено через 2 минуты
Цитата Сообщение от CyberSolver Посмотреть сообщение
Вообще вам надо в раздел фриланс

Меня смущает требование Это прям целый парсер писать. Особенно если разрешить использовать всякие синусы.
раздел фриланс - это крайний случай) всё-таки хотелось бы самому приложить руку...
А прям целый парсер с помощью бинарного дерева и рекурсивного спуска вполне возможен)

Добавлено через 2 минуты
Цитата Сообщение от CyberSolver Посмотреть сообщение
Вообще вам надо в раздел фриланс

Меня смущает требование Это прям целый парсер писать. Особенно если разрешить использовать всякие синусы.
а вот синусов и косинусов не надо, максимум что должно быть - это полином второй степени, что даёт преимущество, то есть для линеаризации полиномов достаточно найти производную не прибегая разложению в ряд)
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
29.07.2014, 20:09     Решение СНАУ методом Ньютона #6
Цитата Сообщение от dfg Посмотреть сообщение
Я так понимаю, что уравнения пользователь должен вводить в виде строки, а потом эти строки должны с помощью парсинга ложиться в динамический массив.
Не вопрос, только напишите тогда что есть корректная строка. К сожалению, С++ - не Питон, и будет
Цитата Сообщение от dfg Посмотреть сообщение
прям целый парсер с помощью бинарного дерева и рекурсивного спуска
Цитата Сообщение от dfg Посмотреть сообщение
Далее по конечно-разностному методу находится производные из которых формироваться матрица Якоби - двухмерный динамический массив. Ну и каким-то методом, скажем Крамера, находиться корни уже линейных уравнений.
Можно значительно проще. Понимаете, вся ваша работа сведется к написанию парсера, а не к методу Ньютона. А это бида-пичалька.
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 20:22  [ТС]     Решение СНАУ методом Ньютона #7
Ну смотрите, наверное меня бы устроил и вариант без парсинга, то есть вводить эти уравнения не в консоли а в самом коде, но чтобы как-то по быстрому что-ли) потому что системы будут считаться большие, типа там 40 уравнений и 40 неизвестных и если каждый раз объявлять переменные, вводить эту кучу уравнений, потом ещё где-то по дороге что менять слишком много времени будет уходить..
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
29.07.2014, 20:28     Решение СНАУ методом Ньютона #8
dfg, тогда проще всего сделать так. Опишите требования к самой функции решения СНАУ (что принимает, что возвращает), хотя бы на словах. Мало ли как вам будет удобно. А затем продумайте, как вы в неё передадите саму систему: руками, вводом из консоли или чтения каких-нибудь входных файлов с описанием. Просто потому что сама задача естественно разбивается на две.
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 20:41  [ТС]     Решение СНАУ методом Ньютона #9
Цитата Сообщение от CyberSolver Посмотреть сообщение
dfg, тогда проще всего сделать так. Опишите требования к самой функции решения СНАУ (что принимает, что возвращает), хотя бы на словах. Мало ли как вам будет удобно. А затем продумайте, как вы в неё передадите саму систему: руками, вводом из консоли или чтения каких-нибудь входных файлов с описанием. Просто потому что сама задача естественно разбивается на две.
Ну функция должна принимать сами уравнения, или может быть одномерный массив уравнений? ну скажем M[1]=pow(x1,2)+x2*4-x3; M[2]=x1+x2*4-pow(x3,2); M[3]=x1*7+pow(x2,2)-x3*4 - это можно вводить руками каждый раз в код, но тогда получается нужно и объявлять переменные x1, x2, x3 каждый раз. А отдавать функция должна сами корни уравнений) Надо подумать как она будет заполнять массив - матрицу Якоби, так как дифференцировать каждый раз нужно будет по разным переменным
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
29.07.2014, 21:12     Решение СНАУ методом Ньютона #10
Цитата Сообщение от dfg Посмотреть сообщение
А прям целый парсер с помощью бинарного дерева и рекурсивного спуска вполне возможен)
Цитата Сообщение от dfg Посмотреть сообщение
максимум что должно быть - это полином второй степени
Ну, тогда ввод элементарен – запрашиваем у пользователя число уравнений, и для каждого уравнения запрашиваем в цикле коэффициент, имя переменной и степень. Вот только 40 уравнений и 40 неизвестных – это около 80 членов в уравнении, т.е. всего надо ввести 40 * 80 = 3200 членов. А откуда они берутся? Может легче их в файл записать, а потом программе считать оттуда?
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 21:47  [ТС]     Решение СНАУ методом Ньютона #11
Ну вообще схема такая: дифференциальные уравнения -> численные методы -> СНАУ. Но мне сказали начать с конца, так как с первыми двумя этапами пока не всё ясно.
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
29.07.2014, 21:58     Решение СНАУ методом Ньютона #12
Цитата Сообщение от dfg Посмотреть сообщение
Ну вообще схема такая: дифференциальные уравнения -> численные методы -> СНАУ. Но мне сказали начать с конца, так как с первыми двумя этапами пока не всё ясно.
Ну, тогда предыдущий этап должен заносить результаты в файл или соответствующую структуру данных, а ваш - считывать их оттуда.
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 22:41  [ТС]     Решение СНАУ методом Ньютона #13
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, тогда ввод элементарен – запрашиваем у пользователя число уравнений, и для каждого уравнения запрашиваем в цикле коэффициент, имя переменной и степень. Вот только 40 уравнений и 40 неизвестных – это около 80 членов в уравнении, т.е. всего надо ввести 40 * 80 = 3200 членов. А откуда они берутся? Может легче их в файл записать, а потом программе считать оттуда?
Ну вот типа такого?
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
#include <iostream>
#include <cstring>
#include <cctype>
#include <conio.h>
 
using std: cout;
using std: cin;
using std: endl;
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Введите количество неизвестных:";
    cin >> N;
    cout << "Введите количество уравнений:";
    cin >> M;
    int k,st;
 
    for(int i(0); i<M; i++);
    {
        for(int i(0); j<N; j++);
        {   
            cout << "Введите коэффициент:";
            cin >> k;
            cout << "Введите имя переменной:";
            cin >> name;
            cout << "Введите степень:";
            cin >> st;
        }
    }
 
    _getch();
    return 0;
}
Но только ещё нужно чтобы эти циклы заполняли динамический массив в виде p[i]=k*pow(name,st).
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
29.07.2014, 22:58     Решение СНАУ методом Ньютона #14
Цитата Сообщение от dfg Посмотреть сообщение
p[i]=k*pow(name,st)
Зачем вы имя переменной в степень возводите? Сюда надо ее значение подставлять, но его определение и является вашей задачей.
Количество переменных не нужно запрашивать - сколько пользователь введет различных имен, столько и будет переменных. Введенные данные нужно сложить в вектор уравнений, каждое уравнение - это вектор членов. Каждый член - это структура, членами которой являются имя переменной (а точнее индекс, так как мы имена пронумеруем), коэффициент и степень.
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
30.07.2014, 00:13  [ТС]     Решение СНАУ методом Ньютона #15
как-то так?
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
#include <iostream>
#include <conio.h>
 
using std:: cout;
using std:: cin;
using std:: endl;
 
using namespace std;
 
struct member
{
    char *name;
    double k;
    int st;
};
 
void Input(member *s)
    {
        cout << "Введите имя переменной:";
        s -> name = new char;
        cin.get();
        cin.getline(s->name,2);
        cout << "Введите коэффициент:";
        cin >> s-> k;
        cout << "Введите степень:";
        cin >> s-> st;
        cout << endl;
    }
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int M;
    cout << "Введите количество уравнений:";
    cin >> M;
 
    int *p = new int[M];
    for(int i(0); i<M; i++)
    {
    member d[4];
    for(int j(0); j<4; j++)
        {
            cout << j+1 << "Переменная: \n\n";
            Input(&d[j]);
 
        }
    }
    _getch();
    return 0;
}
только количество членов у меня 4 записано для примера, а как сделать чтобы было столько сколько захочет пользователь?
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 17:53     Решение СНАУ методом Ньютона #16
Цитата Сообщение от dfg Посмотреть сообщение
Ну вообще схема такая: дифференциальные уравнения -> численные методы -> СНАУ. Но мне сказали начать с конца, так как с первыми двумя этапами пока не всё ясно.
Идиотский, но необходимый вопрос: почему Си++?
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
30.07.2014, 19:38  [ТС]     Решение СНАУ методом Ньютона #17
А чтобы предложили Вы?
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
30.07.2014, 20:24     Решение СНАУ методом Ньютона #18
dfg, я не знаю специфику вашей области. Навскидку могу предложить Matlab или Mathematica (в принципе, любой подобный инструмент) - графики рисуют, уравнения решают, лепота. Если охота самому строчить код (а не должно), то уж лучше Питон - по краней мере, будет быстрее, и есть куча либ опять же для рисования, решения уравнений численно и символьно и т.п. Зачем изобретать свои велосипеды?
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
30.07.2014, 21:59  [ТС]     Решение СНАУ методом Ньютона #19
моя область - это строительная механика, матлаб всё-таки не совсем то, хотелось бы сделать отдельную программу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 05:39     Решение СНАУ методом Ньютона
Еще ссылки по теме:

Решение уравнения методом Ньютона. Локализация корня C++
C++ Решение систем уравнений методом линеаризации(Ньютона)
C++ Решение системы из двух нелинейных уравнений методом Ньютона
C++ Решение системы нелинейных уравнений методом Ньютона (С/С++)
Решение уравнения c методом касательных (Ньютона) C++

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

Или воспользуйтесь поиском по форуму:
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
31.07.2014, 05:39     Решение СНАУ методом Ньютона #20
dfg, зачем? Вы так для каждой задачи будете отдельную программу делать? Кэп подсказывает: компьютер нам нужен для решения конкретных задач. Конкретно эта задача великолепно решается матлабом: формочки для ввода данных рисуются в 2 щелчка, потом расчёт опять же в 3 строки кода и рисование ещё в одну. А вы хотите какие-то парсеры писать.

Если же сами уравнения будет готовить какая-то другая программа, то вот да простят меня любители чистоты кода, но вы можете просто заинклудить файл с исходными уравнениями. То есть первая программа сформирует вам файл input, в котором напишет что-то типа
C++
1
2
3
4
5
6
void func(double * x, double** res, int n, int m)
{
f[0] = sin(x[0]);
// ...
f[m - 1] = pow(x[n - 1], 5);
}
(n - число переменных, m - число уравнений; можно даже формочку нарисовать для ввода, где пользователь тыкнет нужное ему число и тех и других), и потом #include "input" в ваш исходник. Грязный хак, но не надо никаких парсеров, а компилятор пусть сам проверяет корректность выражений и проч. Кстати, вы с GAMS не знакомы?

Но всё же, поверьте: освоить матлаб (или любую подобную софтину) многократно проще и полезней. А разве ваши маткады и автокады так не умеют?
Yandex
Объявления
31.07.2014, 05:39     Решение СНАУ методом Ньютона
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru