Re: NDSolve problem
- To: mathgroup at smc.vnet.net
- Subject: [mg101688] Re: [mg101657] NDSolve problem
- From: "Elton Kurt TeKolste" <tekolste at fastmail.us>
- Date: Tue, 14 Jul 2009 05:37:00 -0400 (EDT)
- References: <200907121058.GAA19030@smc.vnet.net>
Haibo I have placed the Mathematica notebook corresponding to this reply at http://sites.google.com/site/mathematicaworkingpapers/ under the name NDSolve ************************************************** You are trying to access the elements of a list when you have no list. For example, e1[t] is undefined: e1[t] e1[t] so it is possible to do only symbolic manipulations on e1[t]. Since e1[t] is an undefined function, its zeroth part is the head (function name) and its first part is the dummy variable (t): {Part[e1[t],0],Part[e1[t],1]} {e1,t} Or, equivalently {e1[t][[0]],e1[t][[1]]} {e1,t} But e1[t] has no second part e1[t][[2]] Part::partw: Part 2 of e1[t] does not exist. >> e1[t][[2]] So you get an error message from the attempt to access e1[t] in the execution of the function EE. You must explicity, if symbolically, define the components of e1[t]. for example e1[t]:=Table[Subscript[e1, i][t],{i,4}] Then EE[e1[t]]//MatrixForm (Subscript[e1, 2][t]/2 Subscript[e1, 3][t]/2 Subscript[e1, 4][t]/2 1/2 (1-Subscript[e1, 1][t]) -(1/2) Subscript[e1, 4][t] Subscript[e1, 3][t]/2 Subscript[e1, 4][t]/2 1/2 (1-Subscript[e1, 1][t]) -(1/2) Subscript[e1, 2][t] -(1/2) Subscript[e1, 3][t] Subscript[e1, 2][t]/2 1/2 (1-Subscript[e1, 1][t]) ) Unfortunately, fixing this only reveals another problem: NDSolve[{J.e2'[t]==-kq Transpose[EE[e1[t]]].e1[t]-komega (IdentityMatrix[3]+4 Transpose[G[e1[t]]]).\[CurlyTheta][t]-(J.S[e2[t]+\[Omega][t]].(e2[t]+\[Omega][t])+S[e2[t]+\[Omega][t]].J.(e2[t]+\[Omega][t])),\[CurlyTheta]'[t]==-a \[CurlyTheta][t]+b (1/4 IdentityMatrix[3]+G[e1[t]]).e2[t],e1'[t]==EE[e1[t]].e2[t],e1[0]=={1+0.3772,-0.4329,0.6645,0.4783},\[CurlyTheta][0]=={0.3,0.4,0.2},e2[0]=={0.1,0.2,0.3}},{e1,\[CurlyTheta],e2},{t,0,500}] NDSolve::dvnoarg: The function e1 appears with no arguments. >> It seems that you are integrating over e1, which does not feel consistent with definition of e1[t] as a 4-vector. At this point I find your symbolism too obscure to be able to puzzle out your intention. Do you mean functions (e1[t_], e2[t_],...), vectors (e1 = {e1[[1]],e1[[2]],...}), a vcctor-valued function (e1[t] = {Subscript[e1, 1][t], Subscript[e1, 2][t], ...}), or something else? I cannot find an example in which the arguments of NDSolve are vector-valued functions. In fact, a short experiment reveals that you cannot define boundary conditions as vectors: e1[t] {Subscript[e1, 1][t],Subscript[e1, 2][t],Subscript[e1, 3][t],Subscript[e1, 4][t]} e1[0]=Range[4] {1,2,3,4} Subscript[e1, 1][0] Subscript[e1, 1][0] e1[0] {1,2,3,4} I conclude that it will be necessary to specifiy the boundary conditions on the components of e1 separately. On Sun, 12 Jul 2009 02:58 -0400, "Haibo Min" <haibo.min at gmail.com> wrote: > Hi, there. > These days, I am using mathematica to conduct a simulation which is > composed > of a set of matrix ODEs. Maybe there is something wrong in my function > definition or the usage of NDSolve, when implementing the NDSolve > function, > it always tells me that some part of my variables do not exist! I am > really > puzzled by this. Since the simulation program is pretty short. I paste > the > code here, thanks for your time and hints in advance. > > > S[Px_] := ( { > {0, -Px[[3]], Px[[2]]}, > {Px[[3]], 0, -Px[[1]]}, > {-Px[[2]], Px[[1]], 0} > } ); > EE[err_] := 1/2 ( { > {err[[2]], err[[3]], err[[4]]}, > {1 - err[[1]], -err[[4]], err[[3]]}, > {err[[4]], 1 - err[[1]], -err[[2]]}, > {-err[[3]], err[[2]], 1 - err[[1]]} > } ); > G[e_] := 1/2 ( { > {1 - e[[1]], -e[[4]], e[[3]]}, > {e[[4]], 1 - e[[1]], -e[[2]]}, > {-e[[3]], e[[2]], 1 - e[[1]]} > } ) - 1/4 IdentityMatrix[3]; > J = ( { > {4.35, 0, 0}, > {0, 4.337, 0}, > {0, 0, 3.664} > } ); > T = 5000; c = \[Pi]/T; > \[Omega][t_] := 1/5 {-5 cSin[2 ct], 8 cSin[4 ct], 4 cSin[2 ct]}; > kq = 1.2; komega = 4; a = 5; b = 20; > > NDSolve[{J.e2'[t] == -kq Transpose[EE[e1[t]]].e1[t] - > komega (IdentityMatrix[3] + 4 Transpose[G[e1[t]]]).\[CurlyTheta][ > t] - (J.S[e2[t] + \[Omega][t]].(e2[t] + \[Omega][t]) + > S[e2[t] + \[Omega][t]].J.(e2[t] + \[Omega][t])), \[CurlyTheta]'[ > t] == -a \[CurlyTheta][t] + > b (1/4 IdentityMatrix[3] + G[e1[t]]).e2[t], > e1'[t] == EE[e1[t]].e2[t], > e1[0] == {1 + 0.3772, -0.4329, 0.6645, 0.4783}, \[CurlyTheta][ > 0] == {0.3, 0.4, 0.2}, > e2[0] == {0.1, 0.2, 0.3}}, {e1, \[CurlyTheta], e2}, {t, 0, 500}] > > > When evaluating the above code, error occurs: > Part::partw: Part 2 of e1[t] does not exist. >> > Part::partw: Part 3 of e1[t] does not exist. >> > Part::partw: Part 4 of e1[t] does not exist. >> > > It seems that mathematica does not know what e1 is since e1 is also a > parameter of EE and G, which are included in the ODE equation. Does that > mean that I have to give a definition of e1? But if so, it still doesn't > make sense in the NDSolve function... > > > Any suggestion will be appreciated. > > Best regards, > > Haibo > >
- References:
- NDSolve problem
- From: Haibo Min <haibo.min@gmail.com>
- NDSolve problem