2 / 1 / 1
Регистрация: 15.11.2019
Сообщений: 19
1
Matlab 2014

Решение системы уравнений в matlab. Не сходится решение

28.01.2020, 12:30. Показов 3846. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! решаю такую сичтему уравнений (уравнения Кирхгофа применительно к задаче гидравлики для определения расходов). Решение выводится, однако вылазит сообщение, что задача не сошлась за 1100 итераций. При этом ответы зависят от приближения. Помогите пожалуйста разобраться с fsolve, или может есть другой способ решить их в матлабе?
Matlab M
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
clear 
clc
%Количество уравнений по расходам в узлах(сумма равна нулю)
num_ur_Q =6;
%Количество уравнений напора по замкнутым контурам
num_ur_H=5;
% Напорные элементы в каждом из рассматриваемых контуров
HH_v=[500 0 -9500 0 10000];
%Аэродинамическое сопротивление. Каждая строка - ветвь сети, каждый столбец это рассматриваемый контур
ZZ =[0  204.3488  204.3488         0         0
  263.3750  263.3750         0         0         0
    2.9549         0   30.7326         0         0
         0   49.1512         0         0         0
   16.5237         0         0         0         0
         0         0    1.3848    1.3848         0
         0         0         0    1.2302    1.2302
         0         0    4.3523         0   12.3523
         0    2.2050         0    2.2050         0
         0         0    0.8024         0         0
         0         0         0         0    0.6125];
 
%Каждая строка - ветвь, каждый столбец - узел
%По науке - то ли матрица смежности, то ли инцидентности, не помню
Cycles =[1     0     0     1     1     1
     1     1     0     0     0     0
     1     0     0     0     0     0
     0     1     0     0     1     1
     0     1     0     0     0     0
     0     0     1     1     0     1
     0     0     1     0     0     1
     0     0     1     0     0     0
     0     0     0     1     0     0
     0     0     0     0     1     0
     0     0     0     0     0     1];
 
 global num_ur_Q num_ur_H HH_v ZZ Cycles
 
 fun = @root2d;
x0=1*ones(1,11)
    
E=fsolve(fun,x0)
E- искомый вектор расходов.


Вот функция
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
function F = root2d(Q)
global num_ur_Q num_ur_H HH_v ZZ Cycles
% for i=1:num_ur_Q
%     F(i)=sum(Cycles(:,i).*(Q));
% end
% for j=num_ur_Q+1:num_ur_Q+num_ur_H
%         F(j)=sum(Q.^2.*ZZ(:,j-num_ur_Q))-HH_v(j-num_ur_Q);
% end
F(1:num_ur_Q)=Q*Cycles;
F(num_ur_Q+1:num_ur_Q+num_ur_H)=Q.^2*ZZ-HH_v;
 
end
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2020, 12:30
Ответы с готовыми решениями:

Решение системы дифференциальных уравнений в MATLAB
Всем привет. Помогите решить задачу... a,b константы (нужно чтобы их можно было менять)....

Исследовать совместность и найти общее решение и одно частное решение системы уравнений.
Исследовать совместность и найти общее решение и одно частное решение системы уравнений. (3...

Решение не было найдено. Решение системы уравнений
Подскажите пожалуйста, в чем ошибка. Вроде бы все перепроверила, задано все верно. Заметила, что у...

Решение скалярных уравнений в пакете Matlab
Решить уравнение 2^(x)+5*x-3=0 с абсолютной погрешностью не более 0.0001. Добавлено через 8...

18
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
28.01.2020, 14:33 2
Цитата Сообщение от kirill1g Посмотреть сообщение
При этом ответы зависят от приближения.
Похоже Ваша система не имеет решения.
Причина скорее всего в том, что указаны неправильные данные в ZZ, Cycles, HH_v.
Особенно подозрителен Cycles.
При отсутствии описания задачи больше сказать ничего не могу
1
2 / 1 / 1
Регистрация: 15.11.2019
Сообщений: 19
28.01.2020, 15:21  [ТС] 3
Спасибо, что откликнулись! Ошибки пока что найти не удалось. Cycles действительно не до конца верный,но если всё таки решите помочь, в полном коде я оставил как мне кажется подробные комментарии. С правильным вручную введённым Cycles тоже не работает.

Я прилагаю изображение со схемой замещения гидравлической сети. В неё чёрными цифрами отмечены сопротивлекния, красными - ветви, синими - контуры(циклы). Каждое сопротивление и напорный элемент задаются соседними контурами. В коде выделяются узлы и контуры для составления уравнений. Уравнения по какой то причине не решаются.
Законы Кирхкофа для гидравлической сети
1)Сколько втекает в узел, столько и вытекает
2)сумма падений напора на замкнутом контуре равняется сумме напоров напорных элементов.

Последовательные сопротивления в ветви складываются

Полный код
Matlab M
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
clear
clf
rho=1.225; %Задаём плотность воздуха
%1-номер 2 - контур 1   3 - контур 2 4 - сопротивление1 5 - сопр 2 6 - сопр 3 
%7 - площадь
ksi=[1 3 2 0.5 1.1 0 0.07
    2 1 2 0.7 2.2 1.4 0.1   %x
    3 1 3 1.1 0 0 0.2
    4 2 0 0.15 0.1 0.4 0.09  %k
    5 0 1 0.18 0 0 0.13   %o
    6 4 3 1.13 0 0 0.76
    7 4 5 0.54 0 0 0.77
    8 5 4 0.01 0 0 0.32
    9 3 5 0.66 0 0 0.22
    10 5 3 0.0001 0 0 0.99
    11 4 3 0.22 0 0 0.85
    12 2 4 1 1.1 1.5 1
    13 3 2 1 1.1 5 1
    14 3 0 1 0.1 0.21 1
    15 4 5 1 0 0 1
    16 5 0 1 0 0 1]
 
%1-номер сопр, 2 3 - контуры, 4 напор, 5 расход
HQ=[5 1 0 1000 10;
    3 3 -1 500 6;
    9 5 -3 10000 50;]
%Создаём матрицу расположения напорных элементов
HQ_kont=HQ(:,2:3)
%Создаём матрицу расположения сопротивлений
gg=ksi(:,2:3);
 
schetchik_vetvei=0;
vetv_num=[];
 
%Цикл по созданию матрицы, в которой каждая строка соответствует своей
%ветви. В строке каждой ветви распологаются сопротивления, входящие в неё
for sopr_num=ksi(:,1).'
clear proverka
  
  a_find=ksi(sopr_num,2);
  b_find=ksi(sopr_num,3); 
  
  proverka=find(vetv_num==sopr_num);
  if proverka>0
  1;
  else
      
      vetv_num1=sopr_num;
      schetchik_vetvei=schetchik_vetvei+1;
  for sopr_num2=ksi(sopr_num:max(ksi(:,1)),1).'
      
     if sopr_num2==sopr_num      
        
     elseif ksi(sopr_num2,2)==a_find && ksi(sopr_num2,3)==b_find
vetv_num1=[vetv_num1, sopr_num2.'];
     elseif ksi(sopr_num2,3)==a_find && ksi(sopr_num2,2)==b_find
         
         vetv_num1=[vetv_num1, sopr_num2.'];
     else   
     end 
  end
vetv_num(schetchik_vetvei,1:length(vetv_num1))=vetv_num1;
clear vetv_num1
  end
end
%Сопротивления разложенные по ветвям
disp(vetv_num)
 
%Создание матрицы расположения ветвей между контурами. Значения строк те
%же, что и у vetv_num. Т.е. первая строка vetv_num - сопротивления,
%входящие в условно первую ветвь, а первая строка kont_vetv_num -
%расположение этой ветви между контурами
kont_vetv_num=sort(ksi(vetv_num(:,1),2:3)')'
kont_vetv_num=kont_vetv_num+1;
 
%Использование функции подключённого пакета по теории графов. Создание
%матрицы инцидентности. Количество строк - количество ветвей, по столбцам -
%узлы. Количество узлов на один меньше чем в схеме, но именно столько нужно
%для решения системы Кирхгофа. Последние два столбца матрицы находит
%ошибочно, однако проблема оказывается не в них, да и эти найденные
%столбцы, хоть и не соответствуют узлам, имеют физический смысл
%втекания-вытекания в систему труб. Под комментарием матрица,
%соответствующая действительным узлам, вбитая вручную
Cycles=grCycleBasis(kont_vetv_num)
 
% Cycles =[1     0     0     1     0     0
%         1     1     0     0     0     0
%         1     0     0     0     0     0
%         0     1     0     0     1     0
%         0     1     0     0     0     0
%          0     0     1     1     0     0
%          0     0     1     0     1     0
%          0     0     1     0     0     1
%          0     0     0     1     1     0
%          0     0     0     0     0     1
%          0     0     0     0     1     1];
 
 
%Количество уравнений расходоа=кол-во узлов-1
num_ur_Q=length(Cycles(1,:))
%Количество уравнений напоров
num_ur_H=length(kont_vetv_num(:,1))-num_ur_Q
 
 
%Определение в какой ветви какой напорный элемент установлен
napor_vetv=zeros(1,length(kont_vetv_num'));
for hq=1:length(HQ(:,1))
[napor_str, napor_stolb]=find(vetv_num==HQ(hq,1));
napor_vetv(napor_str)=hq;
end
disp(napor_vetv);
 
%Построение характеристик напорных элементов
Q=[];
H=[];
for i=1:length(HQ(:,1))
Q(i,:)=linspace(0,HQ(i,5),200);
    %Это уравнение характеристики вентилятора. Этот цикл не нужен для
    %программы. Дальше раскроются скобки и в матрицу ZZ добавится множитель
    %Q(i,:)^2, а оставшийся член HQ(i,4) поместится в правую часть
    %уравнения
    H(i,:)=HQ(i,4).*(1-(Q(i,:)./HQ(i,5)).^2);
    figure(1)
    plot(Q(i,:),H(i,:))
    hold on
end
 
%Расчёт Z для каждого сопротивления
Zi=sum(ksi(:,4:6)')'.*rho./2./ksi(:,7).^2
 
% Распределение этих сопротивлений по ветвям
 for vn=1:length(vetv_num(:,1))
Current_Z=0;
for vs=1:length(vetv_num(1,:))
    if vetv_num(vn,vs)~=0
Current_Z=Current_Z+Zi(vetv_num(vn,vs));
    end
end
 
    Z_vetv(vn)=Current_Z;
 
 end 
 disp(Z_vetv)   
 clear Current_Z Zi prov_cords
  
 R=[];
 E=[];
konturi=[]%Это контуры, с которыми работаем по уравнениям напоров
ZZ=zeros(length(kont_vetv_num(:,1)),num_ur_H);
 
%Создание матрицы ZZ для записи уравнений напора в матричном виде
% а также вектора с перечислением контуров. ZZ- аэродинамическое
% сопротивление
for y=2:(num_ur_H+1)
clear R E
konturi=[konturi, y];
 [R,E]=find(kont_vetv_num==y);
 E=ones(size(E)).*(y-1);
for r=1:length(R)
ZZ(R(r),E(r))=Z_vetv(R(r));
end
  end
 
 
 
 
  
 
 
%Создание матрицы HH из 0 и 1 характеризующих мастоположение напорных 
%элементов для удобной записи уравнений напора в матричном виде
HH=zeros(length(HQ(:,1)),num_ur_H);
disp(HQ)
for check_kontur=konturi
    [a,b]=find(abs(HQ(:,2:3))==check_kontur-1);
  if a>0
      for j=1:length(a)
          HH(a(j),check_kontur-1)=(HQ_kont(a(j),b(j)))/(abs(HQ_kont(a(j),b(j))));
      end
  end
end
 
 
disp(ZZ)
%Редактирование матрицы ZZ для учёта действия вентиляторов
for i=1:length(ZZ(1,:))
    for j=1:length(ZZ(:,1))
    if ZZ(j,i)~=0
       for k=1:length(vetv_num(1,:))
           a=find(HQ(:,1)==vetv_num(j,k));
           if a>0
              ZZ(j,i)=ZZ(j,i)+HH(a,i).*HQ(a,4)./HQ(a,5)^2;%Тут прибавляется или вычитается 
              %одно из слагаемых, которое получено раскрытием скобок в уравнении характеристики   
              if ZZ(j,i)<0
                  disp('!!!ВОЗНИКНУТ ОБРАТНЫЕ ТОКИ ЧЕРЕЗ СОПРОТИВЛЕНИЕ №!!!')
                  disp(vetv_num(j,k))
              end
           end
       end
    end
    end
end
disp(ZZ)
 
% 
% 
% for t=1:length(HQ(:,1))
%     for check_kontur=konturi
%         a=find(abs(HQ(t,2:3))==check_kontur-1)>0
%         if a>0
%             
%         if HQ_kont(a)>0
%             HH(t, check_kontur-1)=1;
%         elseif HQ_kont(a)<0
%             HH(t, check_kontur-1)=-1;
%         else
%             disp('ошибка. Рассматривается нулевой контур при создании HH')
%         end
%         end
%     end
% end
% disp(HH)
 
%Выделение матрицы Hmax из исзодной матрицы напорных элементов
 
HHmax=HQ(:,4)'
 
%Этот кусок не нужен
 
    %Правая часть из нулей уравнения напоров в матричной форме
%Answer_H=zeros(1,num_ur_H)
% %   Первое уравнение    
%  Q_find*Cycles = Answer_Q
% 
% %   Второе уравнение
   %  Q_find.^2*ZZ-HHmax*HH
 
%Answer=zeros(1,length(kont_vetv_num(:,1)));
 
%Answer(num_ur_Q+1:num_ur_Q+num_ur_H)=abs(HHmax*HH)
 
%B(1:length(Cycles(:,1)),1:length(Cycles(1,:)))=Cycles;
%B(1:length(Cycles(:,1)),length(Cycles(1,:))+1:length(Cycles(1,:))+length(ZZ(1,:)))=(ZZ)
%HH_v=HHmax*HH;
%x0=Answer/B
 
global num_ur_Q num_ur_H HH_v ZZ Cycles
clear Q
 
fun = @root2d;
x0=1*ones(1,11)
       
E=fsolve(fun,x0)


Функция из пакета по теории графов
Matlab M
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
function Cycles=grCycleBasis(E)
% Function Cycles=grCycleBasis(E) find 
% all independent cycles for a connected simple graph
% without loops and multiple edges
% (fundamental set of circuits).
% For loops and multiple edges you need add new vertexes.
% Input parameter: 
%   E(m,2) - the edges of graph;
%     1st and 2nd elements of each row is numbers of vertexes;
%     m - number of edges.
% Output parameter:
%   Cycles(m,m-n+1) - the Boolean array with numbers of edges.
%     n - number of vertexes;
%     m-n+1 - number of independent cycles.
%     In each column of the array Cycles True value have
%     numbers of edges of this cycle.
% Uses the addition of one edge to the spanning tree and deleting of tails.
% Author: Sergii Iglin
% e-mail: siglin@yandex.ru
% personal page: http://iglin.exponenta.ru
 
nMST=grMinSpanTree(E); % data validation and minimal spanning tree
E=sort(E(:,1:2)')'; % only numbers of vertexes
m=size(E,1); % number of edges
n=max(max(E)); % number of vertexes
Erest=E(setdiff([1:m],nMST),:); % rested edges
nr=m-n+1; % number of rested edges
Cycles=zeros(m,nr); % array for cycles
for k1=1:nr, % we add one independent cycle
  Ecurr=[E(nMST,:);Erest(k1,:)]; % spanning tree + one edge
  A=zeros(n);
  A((Ecurr(:,1)-1)*n+Ecurr(:,2))=1;
  A=A+A'; % the connectivity matrix
  p=sum(A); % the vertexes power
  nv=[1:n]; % numbers of vertexes
  while any(p==1), % we delete all tails
    nc=find(p>1); % rested vertexes
    A=A(nc,nc); % new connectivity matrix
    nv=nv(nc); % rested numbers of vertexes
    p=sum(A); % new powers
  end
  [i1,j1]=find(A);
  incedg=nv(unique(sort([i1 j1]')','rows')); % included edges
  Cycles(:,k1)=ismember(E,incedg,'rows'); % current column
end
return
Миниатюры
Решение системы уравнений в matlab. Не сходится решение  
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
28.01.2020, 16:06 4
Лучший ответ Сообщение было отмечено kirill1g как решение

Решение

Цитата Сообщение от kirill1g Посмотреть сообщение
Полный код
У Вас в упрощенном виде решения нет, а Вы приводите усложненный вариант получения матрицы Cycles.
При этом не знаете, какой она должна быть.
Представьте Вы пытаетесь заставить работать код непонятно как работающий и неизвестно что должный получить в результате. По моему вероятность успеха ничтожна, а если что-то получиться то возможно случайно.
У Вас есть трезвая мысль
Цитата Сообщение от kirill1g Посмотреть сообщение
1)Сколько втекает в узел, столько и вытекает
Следовательно перетоки имеют направление (как и ток в эл.схеме), а Вы на схеме направления (расчетные) не поставили.
А помните как в 1-ом законе Кирхгофа - втекающие с плюсом, вытекающие с минусом (ну или наоборот, но не в этом дело - главное разные знаки.
У Вас
Цитата Сообщение от kirill1g Посмотреть сообщение
F(1:num_ur_Q)=Q*Cycles;
Вспомните правила умножения матриц.
Кроме этого выражение
Цитата Сообщение от kirill1g Посмотреть сообщение
Q.^2*ZZ-HH_v;
Возведение в квадрат "съедает" знак, а если Вы помните 2-ой закон Кирхгофа, то знаки падений напряжения на сопротивлениях крайне важны

PS
А приспособление метода узловых потенциалов не проще было бы?
1
2 / 1 / 1
Регистрация: 15.11.2019
Сообщений: 19
28.01.2020, 16:55  [ТС] 5
Матрицу cycles я задавал вручную, и при этом также решения не было.
По поводу направлений мне казалось что знаки выберутся автоматически по первому закону, а во втором они везде в квадрате, и направление течения на перепад напора(напряжения) влиять не будет. При этом знаки напорных элементов учитываются( забыл указать направление, каждый контур рассматривал по часовой стрелке). Нужно хорошенько обдумать это, вы заставили меня усомниться.

О методе узловых потенциалов не слышал, по крайней мере под таким названием. Расскажите пожалуйста, чем он может помочь и в чём заключается?
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
29.01.2020, 07:30 6
Цитата Сообщение от kirill1g Посмотреть сообщение
мне казалось что знаки выберутся автоматически по первому закону
Ну конечно, в MATLABe Бессонов зашит и как только MATLAB услышит Ваши мысли о 1-ом законе Кирхгофа, он сразу знаки правильно расставит.
Цитата Сообщение от kirill1g Посмотреть сообщение
направление течения на перепад напора(напряжения) влиять не будет.
Это тянет на великое "открытие" и шнобелевксую премию.
Как люди раньше не догадались, что при изменении направления течения жидкости в трубе перепад давлений на концах сохраняется. Интересно а в этом случае как жидкость узнает в какую сторону ей течь по направлению уменьшения давления или навстречу.
Цитата Сообщение от kirill1g Посмотреть сообщение
Нужно хорошенько обдумать это, вы заставили меня усомниться.
Думать всегда полезно, и главное попробовать немного вручную посчитать (или посмотреть в отладчике MATLABa) и посмотреть что получается.
А так как в мультфильме "Вовка в тридевятом царстве" засунул в печку что попало и как попало - вот тебе и пирожки. Только пирожки сразу видно что фигня, а тут еще и понять это надо.
Цитата Сообщение от kirill1g Посмотреть сообщение
О методе узловых потенциалов не слышал,
Вы ТОЭ не изучали?
1
2 / 1 / 1
Регистрация: 15.11.2019
Сообщений: 19
29.01.2020, 12:47  [ТС] 7
ТОЭ изучал, но как непрофильный предмет, видать и прозевал.

Вы правы, я действительно не знал, чего хочу получить. Опирался на результаты аналогичной проги в маткаде, которая, как мне казалось, опробирована и не один серьёзный проект на ней рассчитывался, но пока ломал голову и сравнивал результаты, заметил что падения напоров в параллельных ветвях там различны, и соответственно расходы определяются ошибочно.

Решил более простую схему. Вы правы, знаки играют роль. Сравнил с результатом расчёта по заведомо верному методу. Почему не сделал так раньше - не знаю. Был уставший и мозг автоматически отбрасывал эту идею.


Если интересно, объясню свою ошибку. По первому закону всё действительно подобралось бы, но по второму естественно нет. Я руководствовался ошибочной логикой о том, что контур для записи уравнения по второму закону рассматривается как бы отдельно от остальной сети, а в таком контуре падение напора(всё с одним знаком +) равно приросту напора(со знаками + или - в зависимости от направления действия).

Спасибо большое, вы очень помогли. Пойду пытаться автоматизировать выбор направления потока в ветвях.
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
29.01.2020, 13:42 8
Обязательно на схеме расставьте предварительные (расчетные) направления перетоков в ветвях. Если в результате расчета получите отрицательную величину перетока, то значит не угадали с направлением перетока.
Это обязательное требование при расчете эл.цепей, да и гидравлических тоже.
Цитата Сообщение от kirill1g Посмотреть сообщение
По первому закону всё действительно подобралось бы
В этом Вы не правы. Если Все перетоки связанные с узлом все складывать без учета направления(знака) то сумма будет равна только в одном случае, когда все перетоки равны нулю.
Поэтому в матрице Cycles должны быть 1(втекает), 0(в этот узел не попадает), -1(вытекает). Тогда все будет получаться.

В MATLABe есть функция sign(x) для определения знака числа х.
У Вас должно быть что-то типа
F(num_ur_Q+1:num_ur_Q+num_ur_H)=sign(Q).*Q.^2*ZZ-HH_v;
А совпадение или встречка обхода контура и направления перетока отображаться знаком в ZZ
0
416 / 200 / 69
Регистрация: 20.01.2019
Сообщений: 714
29.01.2020, 13:52 9
kirill1g,
Может стоит попробовать этот продукт?
https://matlab.ru/products/simhydraulics
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
29.01.2020, 14:15 10
Цитата Сообщение от AlMih Посмотреть сообщение
Может стоит попробовать этот продукт?
Ну это если лицензия на него есть.
0
2 / 1 / 1
Регистрация: 15.11.2019
Сообщений: 19
31.01.2020, 08:34  [ТС] 11
Делал-делал, и сделал, только вот не решается всё равно. Решил вбить систему для такой схемы вручную, и всё равно сходимость не достигается. При этом простая системка работает и решение её даёт верный результат. Несколько часов пытался ошибку найти и никак не получается. Помогите пожалуйста, может ошибку заметите, или я опять что то не учитываю.
Прилагаю код программы и функции под спойлером. Также прилагаю изображения простой и сложной схем с обозначенными направлениями потоков, пронумерованными вевями. (Ветви пронумерованы красным цветом на сложной схеме). Закомментировваны уравнения для простой схемы.

Программа
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
clear, clc
fun = @root11;
x0 = 10*ones(1,11);  
% x0 = 10*ones(1,3); 
x = fsolve(fun,x0)


Функция

Кликните здесь для просмотра всего текста
Matlab M
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
function F = root11(Q)
Z1=200;
Z2=100;
Z3=100;
Z4=50;
Z5=100;
Z6=50;
Z7=250;
Z8=100;
Z9=200;
Z10=50;
Z11=100;
 
H5=3000;
Q5=20;
H3=2000;
Q3=40;
H8=4000;
Q8=50;
F(1)=-Q(1)-Q(2)+Q(3);
F(2)=Q(2)-Q(4)+Q(5);
F(3)=-Q(6)-Q(7)+Q(8);
F(4)=Q(1)+Q(6)-Q(9);
F(5)=Q(9)+Q(4)+Q(7)-Q(11);
F(6)=-Q(10)-Q(8)+Q(11);
F(7)=-Z2*Q(2)^2-Z3*Q(3)^2+Z5*Q(5)^2-H5*(1-Q(5)^2/Q5^2)+H3*(1-Q(3)^2/Q3^2);
F(8)=-Z1*Q(1)^2+Z2*Q(2)^2+Z4*Q(4)^2-Z9*Q(9)^2;
F(9)=Z1*Q(1)^2+Z3*Q(3)^2-Z6*Q(6)^2-Z8*Q(8)^2+Z10*Q(10)^2-H3*(1-Q(3)^2/Q3^2)+H8*(1-Q(8)^2/Q8^2);
F(10)=Z6*Q(6)^2-Z7*Q(7)^2+Z9*Q(9)^2;
F(11)=Z7*Q(7)^2+Z8*Q(8)^2+Z11*Q(11)^2-H8*(1-Q(8)^2/Q8^2);
 
% F(1)=Q(1)-Q(2)-Q(3);
% F(2)=-200*Q(2)^2+350*Q(3)^2+1000*(1-Q(2)^2/10^2)-500*(1-Q(3)^2/10^2);
% F(3)=170*Q(1)^2+200*Q(2)^2-500*(1-Q(1)^2/7^2)-800*(1-Q(3)^2/10^2);
end
Миниатюры
Решение системы уравнений в matlab. Не сходится решение   Решение системы уравнений в matlab. Не сходится решение  
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
31.01.2020, 13:05 12
Лучший ответ Сообщение было отмечено kirill1g как решение

Решение

Цитата Сообщение от kirill1g Посмотреть сообщение
или я опять что то не учитываю.
Конечно, Вам уже писал
Цитата Сообщение от SSC Посмотреть сообщение
Возведение в квадрат "съедает" знак, а если Вы помните 2-ой закон Кирхгофа, то знаки падений напряжения на сопротивлениях крайне важны
Тоже самое необходимо делать и для описания нагрузочной характеристики насосов.
В Вашей схеме гидронасос в 3-ей ветви работает в режиме двигателя, те переток происходит против направления стрелки.

Matlab M
1
2
3
4
5
F(7)=-sign(Q(2))*Z2*Q(2)^2-Z3*sign(Q(3))*Q(3)^2+Z5*sign(Q(5))*Q(5)^2-H5*(1-sign(Q(5))*Q(5)^2/Q5^2)+H3*(1-sign(Q(3))*Q(3)^2/Q3^2);
F(8)=-Z1*sign(Q(1))*Q(1)^2+Z2*sign(Q(2))*Q(2)^2+Z4*sign(Q(4))*Q(4)^2-Z9*sign(Q(9))*Q(9)^2;
F(9)=Z1*sign(Q(1))*Q(1)^2+Z3*sign(Q(3))*Q(3)^2-Z6*sign(Q(6))*Q(6)^2-Z8*sign(Q(8))*Q(8)^2+Z10*sign(Q(10))*Q(10)^2-H3*(1-sign(Q(3))*Q(3)^2/Q3^2)+H8*(1-sign(Q(8))*Q(8)^2/Q8^2);
F(10)=Z6*sign(Q(6))*Q(6)^2-Z7*sign(Q(7))*Q(7)^2+Z9*sign(Q(9))*Q(9)^2;
F(11)=Z7*sign(Q(7))*Q(7)^2+Z8*sign(Q(8))*Q(8)^2+Z11*sign(Q(11))*Q(11)^2-H8*(1-sign(Q(8))*Q(8)^2/Q8^2);
1
574 / 363 / 186
Регистрация: 11.01.2019
Сообщений: 1,220
31.01.2020, 13:16 13
Лучший ответ Сообщение было отмечено kirill1g как решение

Решение

kirill1g, крокодил не ловится, не решить задачку... Вероятно причина в отсутствии знака в уравнениях давления. Потери давления на участках (см."гугл") вместо Z*Q^2 должны быть Z*|Q|*Q, чтоб знак учитывался. Давление, как и сила, имеют направление действия.

Добавлено через 4 минуты
ну вот, зря старался)
1
2 / 1 / 1
Регистрация: 15.11.2019
Сообщений: 19
31.01.2020, 16:03  [ТС] 14
Эх, знал бы ты сколько я голову ломал! Спасибо тебе! Если для тебя очевидно, разъясни ещё пожалуйста, нужно ли также заменять квадраты неизвестных расходжов в слагаемых, отвечающих за действие напорных элементов? Если тебе не очевидно то думаю сам соображу, просто бошка не варит уже под конец дня)

Добавлено через 15 минут
Извините, что на ты обратился. Ещё не заметил второй ответ. Спасибо обоим!

Добавлено через 1 минуту
А, так в том ответе который я не заметил и был ответ на только что заданный вопрос.

Добавлено через 2 минуты
Цитата Сообщение от SSC Посмотреть сообщение
В Вашей схеме гидронасос в 3-ей ветви работает в режиме двигателя, те переток происходит против направления стрелки.
Спасибо, что обратили внимание. Но всё же в данном случае не так важно. Задача - универсальный код для сетей любой сложности.
0
574 / 363 / 186
Регистрация: 11.01.2019
Сообщений: 1,220
31.01.2020, 16:45 15
kirill1g, расскажите о результатах, когда справитесь
0
5407 / 2762 / 558
Регистрация: 07.11.2019
Сообщений: 4,510
31.01.2020, 22:05 16
Цитата Сообщение от kirill1g Посмотреть сообщение
Задача - универсальный код для сетей любой сложности.
Тогда лучше использовать разреженные матрицы..
0
2 / 1 / 1
Регистрация: 15.11.2019
Сообщений: 19
03.02.2020, 07:31  [ТС] 17
Цитата Сообщение от u235 Посмотреть сообщение
Тогда лучше использовать разреженные матрицы..
Погуглил, действительно, это бы несколько ускорило счёт, не знаю вот только, есть ли в этом необходимость. Не знал, что такое существует, спасибо за замечание!

Добавлено через 47 секунд
Цитата Сообщение от tokrab Посмотреть сообщение
kirill1g, расскажите о результатах, когда справитесь
Выложу готовую программу в эту тему
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
03.02.2020, 08:16 18
Цитата Сообщение от kirill1g Посмотреть сообщение
нужно ли также заменять квадраты неизвестных расходжов в слагаемых
В коде #12 это уже было сделано
Цитата Сообщение от kirill1g Посмотреть сообщение
универсальный код для сетей любой сложности.
Слабое звено для автоматизации в данном подходе это составление контурных уравнений.
0
2 / 1 / 1
Регистрация: 15.11.2019
Сообщений: 19
03.02.2020, 14:08  [ТС] 19
Спасибо большое всем за помощь! Вот программка, придумать сеть чтобы она её не решила я не сумел. Проверка на простых сетях сходится с ручным решением другим методом.
Вложения
Тип файла: rar Kirhgof.rar (6.5 Кб, 4 просмотров)
0
03.02.2020, 14:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2020, 14:08
Помогаю со студенческими работами здесь

Решение систем дифференциальных уравнений в MATLAB
Здравствуйте! Стоит задача решить систему дифф. уравнений (прикрепил во вложения). Решить...

Решение систем дифференциальных уравнений в MATLAB
Помогите решить..

Решение системы нелинейных уравнений 8 уравнений – 8 неизвестных переменных
Решаю систему нелинейных уравнений в символьном виде, решение выполняю с помощью математических...

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


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

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

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