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

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

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

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

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

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

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

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

Решение уравнения c методом касательных (Ньютона) - C++
На интервале с точностью Е(Е > 0) определить значение одного корня уравнения: tg(7x) + (x^2)^sin(x) + 1 Определить максимальное...

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

Написать решение СНУ Методом Ньютона - C++
Собственно необходимо на c++ либо 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
Эксперт С++
3049 / 1694 / 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
Эксперт С++
3049 / 1694 / 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
Эксперт С++
3049 / 1694 / 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 записано для примера, а как сделать чтобы было столько сколько захочет пользователь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 00:13
Привет! Вот еще темы с ответами:

Решение системы нелинейных уравнений методом Ньютона (С/С++) - C++
Здравствуйте! Помогите пожалуйста написать программу :cry: У меня есть система из 2х уравнений (x+lnx)(y+lny)=1 ...

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

Решение системы из двух нелинейных уравнений методом Ньютона - C++
Помогите,мне надо создать программу для решения системы из двух нелинейных уравнений методом Ньютона в с++...не могу найти нигде нормальный...

Вычисление определенного интеграла и решение уравнений методом Ньютона. - C++
С методом дихотомии разобрался,но надо выполнить еще два задания.С заданной точностью найти корень уравнения методом Ньютона (секущих), при...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.07.2014, 00:13
Ответ Создать тему
Опции темы

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