0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 22
1

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

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

Author24 — интернет-сервис помощи студентам
Нужно написать программу для решения систем нелинейных алгебраических уравнений методом Ньютона. Наибольшая сложность заключается в том что на время запуска программы не ясно сколько будет этих уравнений и сколько будет неизвестных. Сам метод Ньютона я понимаю, а вот как это всё реализовать слабо представляю, так как с программированием знаком поскольку-постольку, а программа нужна для научной работы совсем по другой специальности)) Можете подсказать хоть общий план действий, с чего начать... и если есть что-то подобное, поделиться хоть какими-то исходниками) Заранее спасибо)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2014, 18:19
Ответы с готовыми решениями:

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

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

Решение уравнения методом Ньютона
Здравствуйте, столкнулся с такой проблемой.Нужно решить уравнение a*ln|x+b|+c методом Ньютона, где...

Решение уравнения методом Ньютона
Здравствуйте, использую код с данного форума для нахождения корня нелинейного уравнения методом...

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

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

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

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

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

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

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru