SUbstitions

조회 수: 1 (최근 30일)
mortain Antonio
mortain Antonio 2011년 5월 25일
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

채택된 답변

Matt Fig
Matt Fig 2011년 5월 25일
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
mortain Antonio
mortain Antonio 2011년 5월 25일
hit return it's the most important thing :-)
SOrry for being so annoying.....I know I should handle such stupid things on my own!
Shall I send to you the whole program, to see if it's possible to use H instead of hard coding the csi(1), csi(2) etc in M ?
Again, thanks for patience!
Matt Fig
Matt Fig 2011년 5월 26일
I'll take a look at it.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

mortain Antonio
mortain Antonio 2011년 5월 25일
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
Matt Fig
Matt Fig 2011년 5월 25일
You didn't mention that you wanted to use this symbolically in your original post. This makes a world of difference! I don't have the symbolic toolbox, but with any luck Walter, someone else who has the symbolic toolbox will be along to help with this new issue.
mortain Antonio
mortain Antonio 2011년 5월 25일
Sorry I haven't mentioned. I was used to Maple or Fortran where there is no difference

댓글을 달려면 로그인하십시오.


Walter Roberson
Walter Roberson 2011년 5월 25일
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
mortain Antonio
mortain Antonio 2011년 5월 25일
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

댓글을 달려면 로그인하십시오.

제품

Community Treasure Hunt

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

Start Hunting!

Translated by