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

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

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

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

Решение СНАУ методом Ньютона
РЕбят, такое дело, есть у меня задание, решение СНАУ методом Ньютона. Даже не...

Метод Ньютона в решении СНАУ
РЕбят, помогите с прогой. Нужна прога которая решает СНАУ методом Ньютона....

Решение уравнения c методом касательных (Ньютона)
На интервале с точностью Е(Е > 0) определить значение одного корня уравнения:...

Написать решение СНУ Методом Ньютона
Собственно необходимо на c++ либо c# написать и подробно описать каждую строчку...

Решение квадратного уравнения методом Ньютона
напишите прогу метод ньютона на С

Решение системы нелинейных уравнений методом ньютона
Доброго времени суток.В общем, нужно решить систему нелинейных уравнений...

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

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

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

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

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

Меня смущает требование Это прям целый парсер писать. Особенно если разрешить использовать всякие синусы.
а вот синусов и косинусов не надо, максимум что должно быть - это полином второй степени, что даёт преимущество, то есть для линеаризации полиномов достаточно найти производную не прибегая разложению в ряд)
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 852
Записей в блоге: 1
29.07.2014, 20:09 #6
Цитата Сообщение от dfg Посмотреть сообщение
Я так понимаю, что уравнения пользователь должен вводить в виде строки, а потом эти строки должны с помощью парсинга ложиться в динамический массив.
Не вопрос, только напишите тогда что есть корректная строка. К сожалению, С++ - не Питон, и будет
Цитата Сообщение от dfg Посмотреть сообщение
прям целый парсер с помощью бинарного дерева и рекурсивного спуска
Цитата Сообщение от dfg Посмотреть сообщение
Далее по конечно-разностному методу находится производные из которых формироваться матрица Якоби - двухмерный динамический массив. Ну и каким-то методом, скажем Крамера, находиться корни уже линейных уравнений.
Можно значительно проще. Понимаете, вся ваша работа сведется к написанию парсера, а не к методу Ньютона. А это бида-пичалька.
0
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 20:22  [ТС] #7
Ну смотрите, наверное меня бы устроил и вариант без парсинга, то есть вводить эти уравнения не в консоли а в самом коде, но чтобы как-то по быстрому что-ли) потому что системы будут считаться большие, типа там 40 уравнений и 40 неизвестных и если каждый раз объявлять переменные, вводить эту кучу уравнений, потом ещё где-то по дороге что менять слишком много времени будет уходить..
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 852
Записей в блоге: 1
29.07.2014, 20:28 #8
dfg, тогда проще всего сделать так. Опишите требования к самой функции решения СНАУ (что принимает, что возвращает), хотя бы на словах. Мало ли как вам будет удобно. А затем продумайте, как вы в неё передадите саму систему: руками, вводом из консоли или чтения каких-нибудь входных файлов с описанием. Просто потому что сама задача естественно разбивается на две.
0
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 каждый раз. А отдавать функция должна сами корни уравнений) Надо подумать как она будет заполнять массив - матрицу Якоби, так как дифференцировать каждый раз нужно будет по разным переменным
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.07.2014, 21:12 #10
Цитата Сообщение от dfg Посмотреть сообщение
А прям целый парсер с помощью бинарного дерева и рекурсивного спуска вполне возможен)
Цитата Сообщение от dfg Посмотреть сообщение
максимум что должно быть - это полином второй степени
Ну, тогда ввод элементарен – запрашиваем у пользователя число уравнений, и для каждого уравнения запрашиваем в цикле коэффициент, имя переменной и степень. Вот только 40 уравнений и 40 неизвестных – это около 80 членов в уравнении, т.е. всего надо ввести 40 * 80 = 3200 членов. А откуда они берутся? Может легче их в файл записать, а потом программе считать оттуда?
0
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
29.07.2014, 21:47  [ТС] #11
Ну вообще схема такая: дифференциальные уравнения -> численные методы -> СНАУ. Но мне сказали начать с конца, так как с первыми двумя этапами пока не всё ясно.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.07.2014, 21:58 #12
Цитата Сообщение от dfg Посмотреть сообщение
Ну вообще схема такая: дифференциальные уравнения -> численные методы -> СНАУ. Но мне сказали начать с конца, так как с первыми двумя этапами пока не всё ясно.
Ну, тогда предыдущий этап должен заносить результаты в файл или соответствующую структуру данных, а ваш - считывать их оттуда.
0
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).
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.07.2014, 22:58 #14
Цитата Сообщение от dfg Посмотреть сообщение
p[i]=k*pow(name,st)
Зачем вы имя переменной в степень возводите? Сюда надо ее значение подставлять, но его определение и является вашей задачей.
Количество переменных не нужно запрашивать - сколько пользователь введет различных имен, столько и будет переменных. Введенные данные нужно сложить в вектор уравнений, каждое уравнение - это вектор членов. Каждый член - это структура, членами которой являются имя переменной (а точнее индекс, так как мы имена пронумеруем), коэффициент и степень.
0
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 записано для примера, а как сделать чтобы было столько сколько захочет пользователь?
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 852
Записей в блоге: 1
30.07.2014, 17:53 #16
Цитата Сообщение от dfg Посмотреть сообщение
Ну вообще схема такая: дифференциальные уравнения -> численные методы -> СНАУ. Но мне сказали начать с конца, так как с первыми двумя этапами пока не всё ясно.
Идиотский, но необходимый вопрос: почему Си++?
0
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
30.07.2014, 19:38  [ТС] #17
А чтобы предложили Вы?
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 852
Записей в блоге: 1
30.07.2014, 20:24 #18
dfg, я не знаю специфику вашей области. Навскидку могу предложить Matlab или Mathematica (в принципе, любой подобный инструмент) - графики рисуют, уравнения решают, лепота. Если охота самому строчить код (а не должно), то уж лучше Питон - по краней мере, будет быстрее, и есть куча либ опять же для рисования, решения уравнений численно и символьно и т.п. Зачем изобретать свои велосипеды?
0
dfg
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
30.07.2014, 21:59  [ТС] #19
моя область - это строительная механика, матлаб всё-таки не совсем то, хотелось бы сделать отдельную программу
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 852
Записей в блоге: 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 не знакомы?

Но всё же, поверьте: освоить матлаб (или любую подобную софтину) многократно проще и полезней. А разве ваши маткады и автокады так не умеют?
0
31.07.2014, 05:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 05:39
Привет! Вот еще темы с решениями:

Решение системы нелинейных уравнений методом Ньютона (С/С++)
Здравствуйте! Помогите пожалуйста написать программу :cry: У меня есть...

Решение уравнения методом Ньютона. Локализация корня
Собственно, программа имеется, все довольно таки просто, но необходимо...

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

Решение уравнения методом касательных (метод Ньютона) в С++, С
Доброго времени суток. Помогите решить методом касательных уравнение: 1/x -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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