How to make Network/nodal analysis and value distribution in MATLAB?
7 views (last 30 days)
Show older comments
Hi,
I have 8 nodes, where each node is connected to 3 other nodes. Each node have a numerical value (positive or negative). The aim is to make negative nodes 0 by take positive values from connected nodes. (each nodes will be indicated by a variable, eg: a, b, c..... and values will be generated from a simulink model)
I found the solution as:
- Positive and negatives nodes have to be seperated into array
- Take the sum of all positive nodes coming to the negative node and sort it based on the differerence of negative node value to the sum
- The negative node on the top take positive value from the connected node with highest positive number.
- Update the nodal values
- Now above step is repeated again.
I am not sure how to do this, and I need help with this. for checking, these are some reference values. I hope some experienced community members can help me.
Node connections are:
Node 1 - 2,3,8; Node 2 - 1,4,8 ; Node 3 - 1,5,8 ; Node 4 - 2,6,7 ; Node 5 - 3,7,6 ; Node 6 - 4,5,7 ; Nide 7 - 4,5,6 ; Node 8 - 1,2,3
Node values:
Node 1 = -8.95 ; Node 2 = 4.62 ; Node 3 = 14.07 ; Node 4 = -2.69 ; Node 5 = -9.14 ; Node 6 = -0.83 ; Node 7 = 2.2 ; Node 8 = 11.72
0 Comments
Answers (1)
Chunru
on 30 Jun 2022
"graph" can be used for such problem.
Node connections are:
Node 1 - 2,3,8; Node 2 - 1,4,8 ; Node 3 - 1,5,8 ; Node 4 - 2,6,7 ; Node 5 - 3,7,6 ; Node 6 - 4,5,7 ; Nide 7 - 4,5,6 ; Node 8 - 1,2,3
s = [1 1 1 2 2 3 3 4 4 5 5 6 ]'; % undirected graph
t = [2 3 8 4 8 5 8 6 7 7 6 7 ]';
g = graph(s, t);
plot(g)
Node values:
Node 1 = -8.95 ; Node 2 = 4.62 ; Node 3 = 14.07 ; Node 4 = -2.69 ; Node 5 = -9.14 ; Node 6 = -0.83 ; Node 7 = 2.2 ; Node 8 = 11.72
v = [-8.95; 4.62; 14.07; -2.69; -9.14; -0.83; 2.2; 11.72]'
Change values:
The following is a simple approach. Not sure if it always give a solution.
while any(v<0)
% find the minimum of v
[vmin, imin] = min(v);
% find the neighbors of imin
n = neighbors(g, imin);
% borrow values from the neighbor nodes with highest value
[vmax, imax] = max(v(n));
borrowvalue = min(-vmin, vmax);
v(imin) = v(imin) + borrowvalue;
v(n(imax)) = v(n(imax)) - borrowvalue;
fprintf("imin=%d imax=%d ", imin, n(imax))
fprintf("%8.2f ", v)
fprintf('\n')
end
2 Comments
Chunru
on 30 Jun 2022
s = [1 1 2 3]'; % undirected graph
t = [2 3 4 4]';
g = graph(s, t);
plot(g)
v = [ -21.28; 11.15; -8.42; 24.55;]'
sum(v)
k=1;
while any(v<0)
%k
% find the minimum of v
[vmin, imin] = min(v);
% find the neighbors of imin
n = neighbors(g, imin);
% To avoid dead lock
if all(v(n)<=0)
% randomly pick a neigbour
idx_n = n(randi([1 length(n)], 1));
% neighbour of neighbour
n_n = neighbors(g, idx_n);
[vmax, ii ] = max(v(n_n));
ib = n_n(ii);
v(idx_n) = v(idx_n) + v(ib);
v(ib) = 0;
end
% borrow values from the neighbor nodes with highest value
[vmax, imax] = max(v(n));
borrowvalue = min(-vmin, vmax);
v(imin) = v(imin) + borrowvalue;
v(n(imax)) = v(n(imax)) - borrowvalue;
fprintf("imin=%d imax=%d ", imin, n(imax))
fprintf("%8.2f ", v)
fprintf('\n')
k=k+1;
if k>100, break; end
end
See Also
Categories
Find more on Cardiology in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
