SUbstitions

2 views (last 30 days)
Hello,
I have a vector of 15 elemetnts which are functions of 4 elements, here below represented:
h(i)=[1, csi_1, csi_2, csi_3, csi_4, csi_1^2 - 1, csi_1*csi_2, csi_1*csi_3, csi_1*csi_4, csi_2^2 - 1, csi_2*csi_3, csi_2*csi_4, csi_3^2 - 1, csi_3*csi_4, csi_4^2 - 1]
I have 15 different vectors with the valus which those variables should have. E.g. s=[1 2 3 4] gives:
[1, 1, 2, 3, 4, 0, 2, 3, 4, 3, 6, 8, 8, 12, 15]
DO you have any suggestion how to impose for the 15 different cases the different values of csi_i in order to obtain a matrix of only coefficients.
At the moment the expression in csi_i are in the form h(1)=1, h(2)=csi_1, h(3)=csi_2 etc...
I tried with subs but I did not succeed.
THank you very much for your help and suggestions! ANtonio

Accepted Answer

Matt Fig
Matt Fig on 25 May 2011
M = @(csi) [1, csi(1), csi(2), csi(3), csi(4), csi(1)^2 - 1,...
csi(1)*csi(2), csi(1)*csi(3), csi(1)*csi(4),...
csi(2)^2 - 1, csi(2)*csi(3), csi(2)*csi(4),...
csi(3)^2 - 1, csi(3)*csi(4), csi(4)^2 - 1];
s=[1 2 3 4];
M(s) % You can use this directly or assign the results to an array.
%
%
%
% EDIT
If you want to be able to do it all at once for n-by-4, then:
M = @(csi) [ones(size(csi,1),1), csi(:,1), csi(:,2), csi(:,3), csi(:,4),...
csi(:,1).^2 - 1,csi(:,1).*csi(:,2), csi(:,1).*csi(:,3),...
csi(:,1).*csi(:,4), csi(:,2).^2 - 1, csi(:,2).*csi(:,3),...
csi(:,2).*csi(:,4), csi(:,3).^2 - 1, csi(:,3).*csi(:,4),...
csi(:,4).^2 - 1];
s = rand(15,4);
M(s)
  8 Comments
Matt Fig
Matt Fig on 26 May 2011
I'll take a look at it.

Sign in to comment.

More Answers (2)

mortain Antonio
mortain Antonio on 25 May 2011
I tried to use your answer but my program does not allow me anymore to do the derivation (here reported one) can you help with that, please?
csi_1=sym('csi_1');
csi_2=sym('csi_2');
csi_3=sym('csi_3');
csi_4=sym('csi_4');
csi_v(1)=csi_1;
csi_v(2)=csi_2;
csi_v(3)=csi_3;
csi_v(4)=csi_4;
b=sum(diag((csi_v).'*csi_v));
H(1)=1;
i=1;
H(2)=(-1)^(i)*exp(0.5*b)*diff(exp(-0.5* b),csi_1);
H(3)=(-1)^(i)*exp(0.5*b)*diff(exp(-0.5* b),csi_2);
H(4)=(-1)^(i)*exp(0.5*b)*diff(exp(-0.5* b),csi_3);
and so on with other derivations to get the coefficients up.
Thank you very much. If it is off topic I'll open another question.
That is the message:
??? The following error occurred converting from sym to double:
Error using ==> mupadmex
Error in MuPAD command: DOUBLE cannot convert the input expression into a double
array.
If the input expression contains a symbolic variable, use the VPA function instead.
Error in ==> ProvaDiff at 76
H(2)=(-1)^(i)*exp(0.5*b)*diff(exp(-0.5* b),csi_1);
  2 Comments
mortain Antonio
mortain Antonio on 25 May 2011
Sorry I haven't mentioned. I was used to Maple or Fortran where there is no difference

Sign in to comment.


Walter Roberson
Walter Roberson on 25 May 2011
H(1) = 1;
creates H as an array of double. Two lines later you try to assign a symbolic result in to H(2) so the program tries to convert that symbolic result in to a double.
I suggest that above the H(1) assignment, you have
H = repmat(sym(0),1,4);
  1 Comment
mortain Antonio
mortain Antonio on 25 May 2011
Your suggestion was really helpful since I've understood where was the problem. I solved it by putting H(1)=1 at the end!
Thanks again

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!

Translated by