Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460

Метод хорд для решения системы нелинейных уравнений

11.09.2015, 22:16. Показов 4163. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

задал вопрос по чисмету вот тут https://www.cyberforum.ru/nume... ost8064137

Не знаю, стал вот сомневаться, может проблема в коде.
Вот такая система

x*x+y*y-4=0
x*x-y*y-1=0

не знаю, какое нач.приближение. Метод для этой системы расходится (на других не всегда, но работает)

Код:

C++ (Qt)
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <iostream>
#include <cmath>
 
using namespace std;
class SystemOfEquations{
public:
    double EpsX, EpsY;//точность для икс и для игрэк
    double x1,x2,y1,y2,x3,y3;
    double x4,y4; //насколько я понимаю пока, это будет транзитная вещь, ПОТОМУ ЧТО ЕЕ НИГДЕ НЕ ДОЛЖНО БЫТЬ!!!!
    double f4,g4;
    double a,b,q; //для того, чтобы хранить в них значения определителей
    double f1,f2,f3,g1,g2,g3;
    int i,j;
    //зададим функции
    double f(double x, double y)
       {
          // return  x +y -3; // Здесь вводим ту функцию, которую будем эксплуатировать
        return x*x+y*y-4;
       }
    double g(double X, double Y)//разный регистр, так как "не может быть перегружена"
       {
         //  return  X*X+Y*Y-9; // Здесь вводим ту функцию, которую будем эксплуатировать
        return X*X-Y*Y-1;
       }
    //задали функции
 
    void EnterrData() {
         cout<<"Enter EpsX"<<endl;cin>>EpsX;   //лучше извне, наверно
        cout<<"Enter EpsY"<<endl;cin>>EpsY;   //и назвать ф-ию "точность"
        cout<<"Enter x3"<<endl;cin>>x3;       //1
        cout<<"Enter y3"<<endl;cin>>y3;       //5
    }
    void Body(){
       //в этой функции вычисляем на базе введенных x3 и y3 все остальное x2,x1,y2,y1,f1,f2...etc
                    //тестовый вывод на экран
       x1=1.01*x3; /* cout<<endl<<"x1= "<<x1<<endl;
                      cout<<endl<<"y1= "<<y1<<endl;
                      cout<<endl<<"x2= "<<x2<<endl;cout<<endl<<"y2= "<<y2<<endl; */
       y1=y3;
       x2=x3;
       y2=1.01*y3;
}
    void CalcFunc(){
       //вычисляем значение функций
       f3=f(x3,y3); g3=g(x3,y3);
       f2=f(x2,y2); g2=g(x2,y2);
       f1=f(x1,y1); g1=g(x1,y1);
       //тестовый вывод на экран
       /* cout<<"The value of function: "<<endl;
       cout<<"f3= "<<f3<<endl; cout<<"f2= "<<f2<<endl;cout<<"f1= "<<f1<<endl;
       cout<<"g3= "<<g3<<endl; cout<<"g2= "<<g2<<endl;cout<<"g1= "<<g1<<endl;*/
}
 
 
 
    //эти массивы все время будут переопределятся (во всяком случаи я надеюсь), если они будут идти после Body
    void Determinants(){
      double  A[3][3]={ //задали массив, он 3*3, так мы решаем систему из двух уравнений
              {x1,x2,x3}, //массив дет(икс)
              {f1,f2,f2},
              {g1,g2,g3}
                       };
      // вывод определителя на экран
      //тестовый вывод на экран
    /* cout<<endl<<"DetIks "<<endl;
      for(i=0;i<3;i++){
          for(j=0;j<3;j++){
              cout<<A[i][j]<<"  ";
          }
          cout<<endl;
      }*/
      double  B[3][3]={
              {y1,y2,y3}, //массив дет(игрэк)
              {f1,f2,f2},
              {g1,g2,g3}
                       };
      // вывод определителя на экран
      //тестовый вывод на экран
     /*  cout<<endl<<"DetY "<<endl;
      for(i=0;i<3;i++){
          for(j=0;j<3;j++){
              cout<<B[i][j]<<"  ";
          }
          cout<<endl;
      }*/
      double  Q[3][3]={
              {1,1,1}, //массив дет
              {f1,f2,f2},
              {g1,g2,g3}
                       };
      // вывод определителя на экран
      //тестовый вывод на экран
     /* cout<<endl<<"Det  "<<endl;
      for(i=0;i<3;i++){
          for(j=0;j<3;j++){
              cout<<Q[i][j]<<"  ";
          }
          cout<<endl;
      }*/
 
      //Ладно, хоть и кривовато, но посчитаю через формулу
a=A[0][0]*A[1][1]*A[2][2]+A[0][1]*A[1][2]*A[2][0]+A[0][2]*A[1][0]*A[2][1]-A[0][0]*A[1][2]*A[2][1]-A[0][1]*A[1][0]*A[2][2]-A[0][2]*A[1][1]*A[2][0];
b=B[0][0]*B[1][1]*B[2][2]+B[0][1]*B[1][2]*B[2][0]+B[0][2]*B[1][0]*B[2][1]-B[0][0]*B[1][2]*B[2][1]-B[0][1]*B[1][0]*B[2][2]-B[0][2]*B[1][1]*B[2][0];
q=Q[0][0]*Q[1][1]*Q[2][2]+Q[0][1]*Q[1][2]*Q[2][0]+Q[0][2]*Q[1][0]*Q[2][1]-Q[0][0]*Q[1][2]*Q[2][1]-Q[0][1]*Q[1][0]*Q[2][2]-Q[0][2]*Q[1][1]*Q[2][0];
//вычислили значения определителей //можно и красиво сделать через триангуляцию
//тестовый вывод на экран
/*cout<<endl<<endl;
cout<<"The value of determinants: "<<endl;
cout<< "detIks "<<a<<endl;cout<< "detY "<<b<<endl;cout<< "det  "<<q<<endl;*/
}
    void XfourYfour(){
        x4=a/q;y4=b/q;
    }
 
    //если все будет нормально, то эту функцию мы будем вызывать, в main() в конструкции if
    bool Precise(){
     //   cout<<endl<<pow(10,-9)*abs(a);cout<<endl<<pow(10, 9)*q;
     //   cout<<endl<<pow(10,-9)*abs(b);cout<<endl<<pow(10, 9)*q;
        if((pow(10,-9)*abs(a)<pow(10, 9)*q)&&(pow(10,-9)*abs(b)<pow(10, 9)*q))//проверить, возможно тут Лажа!!
            return true;
                    else{
                    //тут надо что-то добавить обязательно!
                    return false;}
    }
    void Rederict(){
        f4=f(x4,y4);g4=g(x4,y4);               //посчитали новую функцию
        x1=x2;x2=x3;x3=x4;y1=y2;y2=y3;y3=y4;   //переопределили иксы и игреки
        f1=f2;f2=f3;f3=f4;g1=g2;g2=g3;g3=g4;   //переопределили функции
    }
 
    bool PreciseEps(){
     //   cout<<endl<<abs((x4-x3)/x4);cout<<endl<<EpsX;
     //   cout<<endl<<abs((y4-y3)/y4);cout<<endl<<EpsY;
        if((abs((x4-x3)/x4)<EpsX)&&(abs((y4-y3)/y4)<EpsY))//проверить, возможно тут тоже Лажа!!//ааа, понятно, нельзя так рано
                                                          //переприсваивать
            return true;
                    else{
         /*  x1=x2;x2=x3;x3=x4;y1=y2;y2=y3;y3=y4;
            f4=f(x4,y4);g4=g(x4,y4);
            f1=f2;f2=f3;f3=f4;g1=g2;g2=g3;g3=g4;*/
                    return false;}
    }
 
 
};
 
int main( )
{
    int y=1;
    SystemOfEquations W;
    W.EnterrData();//ввели данные
 
    for(;;){
        W.Body();          //посчитали x1,x2,y1,y2
        W.CalcFunc();      //посчитали знач. функций f1,f2,f3,g1,g2,g3
        W.Determinants();  //задали и посчитали дерминанты
        W.XfourYfour();    //посчитали x4, y4
 
     //теперь заходим в цикл, который откорректирует нач. приближение
while(W.Precise()){   //если выполняется точность, то выйти, если нет:
        W.Rederict(); //сначала снова переопределяем
        W.Body();     //потом опять считаем x1,x2,y1,y2
        W.Determinants(); //детерминанты снова считаем
        W.XfourYfour();   //и вычисляем x4 и y4
} //и так до тех пор, пока нач. приближение не будет нормальным
 
if(W.PreciseEps()){break;}
W.Rederict();      //переопределили
    }
 
    cout<<endl;//вывели на экран
    cout<<"x= "<<W.x4<<endl;
    cout<<"y= "<<W.y4<<endl;
//while(W.PreciseEps());
}//конец процедуры main()
Точный корень тут: http://studlab.com/news/reshen... -12-23-338
Алгоритм во вложении. Правильно ли я его закодил?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.09.2015, 22:16
Ответы с готовыми решениями:

Метод Ньютона для решения системы нелинейных уравнений
Программа работает неверно. Пожалуйста, помогите найти ошибки. Спасибо. #include &lt;iostream&gt; #include &lt;math.h&gt; using...

Метод Ньютона для решения системы нелинейных уравнений
Здравствуйте! Нужно решить методом Ньютона систему уравнений с точностью 0.0001: sin(x+y) - 1.2x = 0 x*x + y*y =1 Вот моя программа,...

Исследовать итерационный метод- метод касательных для решения нелинейных уравнений
прочитал много всего , но сам пример реализовать никак не могу , кто может помогите F(x) = x5+5x+1=0 с...

31
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 01:23
Данная система сводится к линейной заменой
a = x2
b = y2
А линейная система решается методом Крамера.
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 06:36  [ТС]
Спасибо за ответ, но задание мое заключается именно в том, чтобы запрограммировать этот метод..

Добавлено через 23 минуты
https://www.cyberforum.ru/atta... 1441998711
Алгоритм тут
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 11:48
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Алгоритм тут
Дык, все равно метод Крамера.

Цитата Сообщение от Blitzor DDD Посмотреть сообщение
не знаю, какое нач.приближение
Решите линейную систему на листочке и получите корни.
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 12:52  [ТС]
Ну хорошо, а представьте теперь (программа то должна быть универсальной), что
система, например, другая. Вот такая:

x*x+y*y-2=0
exp(x-1)+y*y-2=0

Как тогда?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 13:54
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
программа то должна быть универсальной
Не, ну если вы matcad пишете, то да.
А так - вряд ли.

Но и в matcad нужно корни прикинуть на листочке.
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 15:36  [ТС]
Решение задачи ни в Matlab, ни в Mathcad в силу своей простоты не покатит. На С++ надо программу написать, в этом вся фишка.

Вот я и хочу узнать, то ли метод расходится потому что я нач.приближение неправильно задаю, то ли в коде ошибка.
Нигде не видел реализацию этого метода на С++.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 15:44
Цитата Сообщение от IrineK Посмотреть сообщение
если вы matcad пишете
Где тут в matcad?

Имелось в виду, что вы на сях создаете глубоко интеллектуальное приложение, вот такое:
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
программа то должна быть универсальной
способное бросить вызов matcad и matlab вместе взятым.
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 15:54  [ТС]
Не понимаю, о чем Вы.
Можете пожалуйста разъяснить поподробнее?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 16:08
Универсальное приложение вы не создадите.
Хорошо, если с конкретной задачей справитесь.

Попробуйте начальные значения: х = 1.5, у = 1.1
1
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 16:36  [ТС]
О!
Намного ближе! Почему Вы считаете, что так я не знаю, но тут результат больше похож на правду,
выдает x=1.8 y=1.6

Почти правильно! Только вот должно быть х=1.6, у=1.2

Видимо, все-таки код я правильно написал, да?
Дело в правильно выбранном нач. приближении?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 17:52
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
//проверить, возможно тут Лажа!!
Угу, полнейшая.
1
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 18:04  [ТС]
Интересно)
Расскажи пожалуйста поподробнее, если Вам не трудно.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 18:09
pow(10,-9)*abs(a)<pow(10, 9)
И когда такое случится?

Добавлено через 1 минуту
Вернее, не случится?
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 18:11  [ТС]
И тут вроде нормально все

C++ (Qt)
1
 if((pow(10,-9)*abs(a)<pow(10, 9)*q)&&(pow(10,-9)*abs(b)<pow(10, 9)*q))
и тут

C++ (Qt)
1
 if((abs((x4-x3)/x4)<EpsX)&&(abs((y4-y3)/y4)<EpsY))
Что не так??

Добавлено через 59 секунд
Цитата Сообщение от IrineK Посмотреть сообщение
pow(10,-9)*abs(a)<pow(10, 9)
И когда такое случится?
Добавлено через 1 минуту
Вернее, не случится?
__________________
Так если случится, то все хорошо, а если нет, то сделаем переприсваивание
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 18:17
Сколько у вас abs(a)?
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 18:50  [ТС]
a - это определитель, он постоянно вычисляется

C++ (Qt)
1
2
3
4
5
double  A[3][3]={ //задали массив, он 3*3, так мы решаем систему из двух уравнений
              {x1,x2,x3}, //массив дет(икс)
              {f1,f2,f2},
              {g1,g2,g3}
                       };
C++ (Qt)
1
a=A[0][0]*A[1][1]*A[2][2]+A[0][1]*A[1][2]*A[2][0]+A[0][2]*A[1][0]*A[2][1]-A[0][0]*A[1][2]*A[2][1]-A[0][1]*A[1][0]*A[2][2]-A[0][2]*A[1][1]*A[2][0];
это нужно для вычисления икса и игрека. Этот массив постоянно меняется и переприсваивается

Добавлено через 30 минут
IrineK, видимо, все правильно, как Вы считаете?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
12.09.2015, 19:06
Я считаю, что этот if выполняется не менее, чем всегда.
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
12.09.2015, 19:12  [ТС]
Ну даже если так, то что это меняет?
Если всегда, то это не вредит коду никак согласитесь. Можно его выкинуть, но это не принципиально, если остальное правильно.
Как Вы считаете?

Добавлено через 4 минуты
Ну ладно.

Видимо трудно сыскать спеца, который бы разбирался и в С++, и на должном уровне в Вычислительной математике...
Но! Если таковой найдётся, то я буду очень рад, если он напишет конструктивный комментарий!

Заранее спасибо

P.S.
Алгоритм тут: https://www.cyberforum.ru/atta... 1441998711
0
12.09.2015, 19:44

Не по теме:

Blitzor DDD, Как Вы додумались написать число 1e-9 в виде pow(10,-9)?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2015, 19:44
Помогаю со студенческими работами здесь

Метод деления отрезка пополам для решения нелинейных уравнений (метод дихотомии)
Здравствуйте. Помогите пожалуйста дописать программу. Вот что вымучал, но на сдаче завалили, типо нет вывода корней, не рассмотрены...

Написать программу для решения системы нелинейных уравнений
Не могу сделать прогу на С++. Кто сделает - огромное спасибо. sin(9x)+cos(7y)-5z*z=10, cos(x)+y-tan(2x)=17, cos(x)+6y-cos(z)=23; ...

Метод Ньютона для решения нелинейных уравнений: узнать количество итераций
Задание: реализовать метод Ньютона для решения нелинейных уравнений, в итоге получить: значение неизвестной и количество итераций,...

Исправить код метод Ньютона для решения систем нелинейных уравнений под нужное условие
Данный код для решения системы ax+tg(xy)=0; (y^2-b^2)+lnx=0 Перепишите его,пожалуйста для системы 2x-y-10=0 5x^2-20y^2-100=0 ...

Метод простых итераций для решения системы линейных уравнений
помогите найти ошибку в алгоритме при вводе уравнения x+y = 2 2x-y = 7 x = 2-y; y = (7-2*x)/-1 double ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru