5 views (last 30 days)

I am running simulations in which I solve a system of 3 equations and 3 unknowns for n values of a parameter, with m random guesses in the solver for each of the n parameter values. The solutions array is nxmx3. I want to separate the solutions along the second dimension into m nx3 matrices and stack them into a 2 dimensional matrix (n*m)x3 where I am effectively displaying all possible solutions, sorted by the parameter value. Here are the 3 equations:

if true

function F=equations(a,S) %S is the parameter I am varying along the first dimension

F(1)=2*((a(3))^2-(a(1))^2 )^0.5-((1-2*a(1)))/((1-2*a(1))^2+...

(1-2*a(2))^2 )^0.5*((a(3))^2-0.25*((1-2*a(1))^2+(1-2*a(2))^2 ))^0.5;

F(2)=2*((a(3))^2-(a(2))^2 )^0.5-((1-2*a(2)))/((1-2*a(1))^2+...

(1-2*a(2))^2 )^0.5*((a(3))^2-0.25*((1-2*a(1))^2+(1-2*a(2))^2 ))^0.5;

F(3)=acos(0.5*((1-2*a(1))^2+(1-2*a(2))^2)^0.5/a(3))+...

acos((a(1))/(a(3)))+acos((a(2))/(a(3)))+(0.5*((1-2*a(1))^2+...

(1-2*a(2))^2)^0.5*((a(3))^2-0.25*((1-2*a(1))^2+(1-2*a(2))^2 ))^0.5)...

/((S-2*(a(3))^2))+(a(1)*((a(3))^2-(a(1))^2 )^0.5)/((S-2*(a(3))^2))...

+(a(2)*((a(3))^2-(a(2))^2)^0.5)/((S-2*(a(3))^2))-pi;

end

end

Here is my code for solving the system.

if true

clear;

clc;

%Preallocations

n=10;% This tells me how many values of S I use. I made it small for your convenience.

m=5;% This tells me how many guesses are guessed per S. I made it small for your convenience.

draw=100;

S=zeros(n,1);

guess=zeros(n,m,3);

b=zeros(n,m,1);

c=zeros(n,m,1);

d=zeros(n,m,1);

solutions=zeros(n,m,3);

for t=1:n;

S(t)=(t+n/(3+2^1.5))/n; %this is the parameter that varies. n values.

for k=1:m;

%generating the guess matrix

b(t,k)=randsample(draw,1);

c(t,k)=randsample(draw,1);

d(t,k)=randsample(draw,1);

guess(t,k,1)=b(t)/(2*draw+1);

guess(t,k,2)=c(t)/(2*draw+1);

guess(t,k,3)=d(t)*1.2/(2*draw+1);

%solving the off-diagonal system

system = @(a)equations(a,S(t));

solutions(t,k,:)=fsolve(system,guess(t,k,:));%=[a(1) a(2) a(3)]

end

end

end

Now that I have the nxmx3 solutions matrix, I want to remove the second dimension and somehow "stack" the m nx3 matrices into one big (n*m)x3 matrix. I tried using a for loop and cat() but I don't think that is a good way. Here is how I started. Please advise. Your help is GREATLY appreciated!

if true

sols2d=zeros(m*n,3);

for k=1:m

submat(k)=solutions(:,k,:);%dimension mismatch error here

rsubmat(k)=reshape(submat(k),[n,3]); %tried to make m nx3 matrices

cat(1,[]);

end

end

Thank you!

Chris Turnes
on 5 Jan 2016

>> m = 3;

>> n = 4;

>> A = reshape(1:(m*n*3), [m n 3]); % make an example array

>> B = reshape(permute(A, [2 1 3]), [m*n 3]);

>> % First nx3 solution:

>> B(1:n,:)

ans =

1 13 25

4 16 28

7 19 31

10 22 34

>> % Compare against original entries in A:

>> A(1, :, :)

ans(:,:,1) =

1 4 7 10

ans(:,:,2) =

13 16 19 22

ans(:,:,3) =

25 28 31 34

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.