I have adajacency matrix B. Now ,I want to write a matlab code for time series .I have written some part of the code

5 ビュー (過去 30 日間)
mks
mks 2023 年 8 月 14 日
回答済み: Divyam 2024 年 11 月 19 日 4:05
clc;
clear all;
n = 10;
C= zeros(n, n);
C(1,n)=1;
C(1,n-1)=1;
C(2,n)=1;
A = zeros(n, n);
for i = 1:n
for j = 1:n
if j==i+1 || j == i + 2
A(i,j) = 1;
else
A(i, j) = 0;
end
end
end
B1=A+C;
B=B1+B1';
% Parameters
% matrixSize = 10; % Size of the matrix
numEdgesToRewire = 3; % Number of edges to rewire
% Create an initial matrix
% Y = B;
matrixSize=10;
% Randomly select two edges to rewire
edgesToRewire = randperm(matrixSize, numEdgesToRewire);
% Iterate through the edges to rewire
for i = 1:numEdgesToRewire
node1 = edgesToRewire(i);
node2 = randi([1, matrixSize]);
% Avoid rewiring to the same node or existing edges
while node2 == node1 || B(node1, node2) == 1
node2 = randi([1, matrixSize]);
end
% Rewire the edge
B(node1, node2) = 1;
B(node2, node1) = 1;
end
% Display the rewired matrix
disp(B);
%%
function xprime = kau(t,x,B)
theta=0.3;dh=2^-9;dp=2^-7;phi=3;ita=1;
n=10;
% nn=n*d;
f=[];
for i=1:n;
y1=[x(1);x(3);x(5);x(7);x(9);x(11);x(13);x(15);x(17);x(19)];
y2=[x(2);x(4);x(6);x(8);x(10);x(12);x(14);x(16);x(18);x(20)];
f= [f; x(2i-1)*(1-theta*x(2i-1))-(x(2i))-(x(2i-1)*x(2i))/(1+x(2i))+dh*B*y1;...,
(phi*x(2i-1)*x(2i))/(1+x(2i))-ita*x(2i)+dp*B*y2];
end
end
xprime=f-B*y
x0=[h0,p0];
h0=rand(10,1);
p0=rand(10,1);
[t,xsol]=ode45(kau,[0 100],x0);
solutions=[];
% h=rand(10,1);
% p=rand(10,1);
H=sum(y1);
P=sum(y2);
plot(t,H,'b');
plot(t,P,'r');

回答 (1 件)

Divyam
Divyam 2024 年 11 月 19 日 4:05
Hi @mks,
The code uses a deterministic method for rewiring the adjacency matrix and can cause issues such as self looping and duplication of edges. Rewiring the edges randomly will fix this issue. Here is a sample code that can be modified as per your specific requirements:
clc;
clear all;
% Parameters
n = 10;
numEdgesToRewire = 3; % Number of edges to rewire
% Create adjacency matrix B
C = zeros(n, n);
C(1, n) = 1;
C(1, n-1) = 1;
C(2, n) = 1;
A = zeros(n, n);
for i = 1:n
for j = 1:n
if j == i + 1 || j == i + 2
A(i, j) = 1;
end
end
end
B1 = A + C;
B = B1 + B1';
% Rewire edges
edgesToRewire = randperm(n, numEdgesToRewire);
for i = 1:numEdgesToRewire
node1 = edgesToRewire(i);
node2 = randi([1, n]);
% Avoid rewiring to the same node or existing edges
while node2 == node1 || B(node1, node2) == 1
node2 = randi([1, n]);
end
% Rewire the edge
B(node1, node2) = 1;
B(node2, node1) = 1;
end
% Display the rewired matrix
disp('Rewired adjacency matrix B:');
disp(B);
% Initial conditions
h0 = rand(n, 1);
p0 = rand(n, 1);
x0 = [h0; p0];
% Solve the differential equations
[t, xsol] = ode45(@(t, x) kau(t, x, B), [0 100], x0);
% Extract solutions
H = sum(xsol(:, 1:n), 2);
P = sum(xsol(:, n+1:end), 2);
% Plot the results
figure;
plot(t, H, 'b', 'DisplayName', 'H(t)');
hold on;
plot(t, P, 'r', 'DisplayName', 'P(t)');
xlabel('Time');
ylabel('Population');
legend;
title('Time Series of H and P');
hold off;
% Function defining the differential equations
function xprime = kau(t, x, B)
theta = 0.3;
dh = 2^-9;
dp = 2^-7;
phi = 3;
ita = 1;
n = 10;
y1 = x(1:n);
y2 = x(n+1:end);
f = zeros(2*n, 1);
for i = 1:n
f(i) = y1(i) * (1 - theta * y1(i)) - y2(i) - (y1(i) * y2(i)) / (1 + y2(i)) + dh * (B(i, :) * y1);
f(n+i) = (phi * y1(i) * y2(i)) / (1 + y2(i)) - ita * y2(i) + dp * (B(i, :) * y2);
end
xprime = f;
end
Here, using the "randperm" method, you can randomly select the number of edges to rewire and remove the possibility of self looping, for more information about the "randperm" function refer to this documentation: https://www.mathworks.com/help/matlab/ref/randperm.html

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by