How can I merge two dictionaries on their values? - dictionary

I have two dictionaries:
dict_A = {"a": 25, "b": 2, "c": 4}
dict_B = {"r": 2, "t": 25, "g": 4}
I want to make a new dictionary, dict_C, that merges them on their values but makes dict_B's keys the new values, ie.
dict_C = {"a": "t", "b": "r", "c": "g"}

You can make inverted dictionary from dict_A and dict_B and then do merge:
dict_A = {"a": 25, "b": 2, "c": 4}
dict_B = {"r": 2, "t": 25, "g": 4}
inv_dict_A = {v: k for k, v in dict_A.items()}
inv_dict_B = {v: k for k, v in dict_B.items()}
dict_C = {inv_dict_A[k]: inv_dict_B[k] for k in inv_dict_A if k in inv_dict_B}
print(dict_C)
Prints:
{'a': 't', 'b': 'r', 'c': 'g'}

Related

transform dataframe to json structure

Need help with converting this df to exact JSON as an example using R. Already tried a lot of approaches but cant succeed. Please help.
Code for generating sample:
df <- data.frame(month = c(1, 1, 1, 2, 2, 2),
station = c('AE', 'DС', 'CL', 'AE', 'DC', 'CL'),
persons = c(3, 12, 21, 12, 10, 9),
results = c(10, 34, 57, 19, 16, 5)
)
Its needed to drop column "station" and add level "summary" which gather results to pairs "person" and "results" just as like example shows.
Needed JSON output.
[
{
"month": "1",
"summary": [
{
"persons": 3,
"results": 10
},
{
"persons": 12,
"results": 34
},
{
"persons": 21,
"results": 57
}
]
},
{
"month": "2",
"summary": [
{
"persons": 12,
"results": 19
},
{
"persons": 10,
"results": 16
},
{
"persons": 9,
"results": 5
}
]
}
]
You could use tidyr::nest and jsonlite::toJson like so:
library(tidyr)
library(dplyr)
library(jsonslite)
df |>
select(-station) |>
group_by(month) |>
nest() |>
rename(summary = data) |>
jsonlite::toJSON()
#> [{"month":1,"summary":[{"persons":3,"results":10},{"persons":12,"results":34},{"persons":21,"results":57}]},{"month":2,"summary":[{"persons":12,"results":19},{"persons":10,"results":16},{"persons":9,"results":5}]}]

Nested R dataframe to JSON with objects instead of arrays

I need to convert a dataframe to JSON. There are several nested dataframes as variables in the dataframe to convert to JSON.
But, when converting to JSON, I need the data for Values1 described below to be an object (enclosed in {} only) instead of an array (enclosed in []).
The code below is a reprex to show my current workflow and problem.
library(dplyr)
library(tidyr)
library(jsonlite)
df1 <- data.frame(name = c("a", "b", "c"),
v = c(1, 2, 3),
w = c(10, 20, 30)) %>%
group_by(name) %>%
nest_legacy(.key = "Values1")
df2 <- data.frame(name = c("a", "b", "c"),
x = c(5, 10, 15),
y = c(100, 200, 300),
z = c(1000, 2000, 3000)) %>%
group_by(name) %>%
nest_legacy(.key = "Values2")
df3 <- df1 %>%
left_join(df2)
json <- toJSON(df3, dataframe = "rows", pretty = TRUE)
json
This is what the json from the above looks like:
> json
[
{
"name": "a",
"Values1": [
{
"v": 1,
"w": 10
}
],
"Values2": [
{
"x": 5,
"y": 100,
"z": 1000
}
]
},
{
"name": "b",
"Values1": [
{
"v": 2,
"w": 20
}
],
"Values2": [
{
"x": 10,
"y": 200,
"z": 2000
}
]
},
{
"name": "c",
"Values1": [
{
"v": 3,
"w": 30
}
],
"Values2": [
{
"x": 15,
"y": 300,
"z": 3000
}
]
}
]
But, this is what I need it to look like:
> json
[
{
"name": "a",
"Values1": {
"v": 1,
"w": 10
},
"Values2": [
{
"x": 5,
"y": 100,
"z": 1000
}
]
},
{
"name": "b",
"Values1": {
"v": 2,
"w": 20
},
"Values2": [
{
"x": 10,
"y": 200,
"z": 2000
}
]
},
{
"name": "c",
"Values1": {
"v": 3,
"w": 30
},
"Values2": [
{
"x": 15,
"y": 300,
"z": 3000
}
]
}
]
Any ideas how to convert Values1 from arrays to objects? They cannot be in arrays as the API does not accept the [.
I have looked at using unbox() from jsonlite but this only works on singletons. I have also tried to construct my final dataframe in various ways.
Any tips/ideas greatly appreciated!
This should return what you desire:
...
df3 <- left_join(df1, df2, by = "name")
json <- mutate(df3, Values1 = purrr::map(Values1, as.list)) %>%
jsonlite::toJSON(auto_unbox = TRUE, pretty = TRUE)
Can you confirm?

Prolog recursively replace elements of list with elements of another list

Apologies for lack of clarity in title. The following is a very specific predicate I'm building, which is only partially working as intended.
% replace_elements(+SearchingElementsList,+ReplacementsList,+OriginalList,-ResultingList).
% ResultingList consists of all elements of SearchingElementsList replaced by elements of ReplacementsList respectively.
replace_elements([],[],_,_).
replace_elements([H|T],[H2|T2],[H3|T3],List) :-
H \= H3, % H is not H3, therefore
replace_elements([H|T],[H2|T2],T3,List). % Skip this element and continue with T3.
replace_elements([H|T],[H2|T2],[H|T3],[H2|List]) :-
replace_elements(T,T2,T3,List). % H is found in OriginalList. Continue with tails.
Currently:
?- replace_elements([1,2,3],[one,two,three],[1,2,3,4,5],Result).
?- Result = [one,two,three|_7636].
Expected:
?- Result = [one,two,three,4,5].
Any hint would be appreciated!
Edit: Came up with a working answer for my specific problem.
% Eventually, recursion starts from all empty lists.
replace_elements([],[],[],[]).
% Rules are empty, push remaining H to List.
replace_elements([],[],[H|T],[H|List]) :-
replace_elements([],[],T,List).
% Empty list, just go through remaining rules.
replace_elements([H|T],[H2|T2],[],List) :-
replace_elements(T,T2,[],List).
% H < H3, move to next element in rules.
replace_elements([H|T],[H2|T2],[H3|T3],List) :-
H < H3,
replace_elements(T,T2,[H3|T3],List).
% H > H3, move to next element in original list.
replace_elements([H|T],[H2|T2],[H3|T3],[H3|List]) :-
H > H3,
replace_elements([H|T],[H2|T2],T3,List).
% Element is the same, push replacement H2 to List.
replace_elements([H|T],[H2|T2],[H|T3],[H2|List]) :-
replace_elements(T,T2,T3,List).
Here is my implementation using if_/3 and extended version of memberd_t adding more list as parameters in order to achieve both checking the Searching Elements List and returning the result from ReplacementsList in one pass-traversing for efficiency:
replace_elements( [], [], _, _).
replace_elements([H|T], [H2|T1], Search_L, Replace_L):-
if_(
memberd_t(H, X, Search_L, Replace_L),
(
H2 = X,
replace_elements( T, T1,Search_L, Replace_L)
),
(
H2 = H,
replace_elements( T, T1,Search_L, Replace_L)
)
).
memberd_t(H, X, Xs, Ys , T) :-
i_memberd_t(Xs, Ys, H, X, T).
i_memberd_t([], [], _, _, false).
i_memberd_t([X|Xs], [Y|Ys], E, H, T) :-
if_( X = E, (T = true, H = Y) , i_memberd_t(Xs, Ys, E, H, T) ).
Some testcases:
?- replace_elements([1,2,3,4,5],Result,[1,2,3],[one,two,three]).
Result = [one, two, three, 4, 5].
?- replace_elements([1,2,3,4,5],Result,[1,2,3],Ts).
Result = [_792, _894, _1032, 4, 5],
Ts = [_792, _894, _1032].
?- L = [1|L1], replace_elements(L ,[one,two,three,4,5],[1,2,3],[one,two,three]).
L = [1, 2, 3, 4, 5],
L1 = [2, 3, 4, 5] ;
L = [1, 2, three, 4, 5],
L1 = [2, three, 4, 5] ;
L = [1, two, 3, 4, 5],
L1 = [two, 3, 4, 5] ;
L = [1, two, three, 4, 5],
L1 = [two, three, 4, 5].
?- replace_elements(L ,[one,two,three,4,5],[1,2,3],[one,two,three]).
L = [1, 2, 3, 4, 5] ;
L = [1, 2, three, 4, 5] ;
L = [1, two, 3, 4, 5] ;
L = [1, two, three, 4, 5] ;
L = [one, 2, 3, 4, 5] ;
L = [one, 2, three, 4, 5] ;
L = [one, two, 3, 4, 5] ;
L = [one, two, three, 4, 5].
In_L = Result, Result = [] ;
In_L = [1],
Result = [one] ;
In_L = [1, 1],
Result = [one, one] ;
In_L = [1, 1, 1],
Result = [one, one, one] ;
In_L = [1, 1, 1, 1],
Result = [one, one, one, one] ;
In_L = [1, 1, 1, 1, 1],
Result = [one, one, one, one, one] ;
In_L = [1, 1, 1, 1, 1, 1],
Result = [one, one, one, one, one, one] ;
In_L = [1, 1, 1, 1, 1, 1, 1],
Result = [one, one, one, one, one, one, one] ;
In_L = [1, 1, 1, 1, 1, 1, 1, 1],
Result = [one, one, one, one, one, one, one, one] ;
In_L = [1, 1, 1, 1, 1, 1, 1, 1, 1],
Result = [one, one, one, one, one, one, one, one, one]...and goes on....
?- replace_elements([1,2,3,4,5],Result,[1,2,X],[one,two,three]).
Result = [one, two, three, 4, 5],
X = 3 ;
Result = [one, two, 3, three, 5],
X = 4 ;
Result = [one, two, 3, 4, three],
X = 5 ;
Result = [one, two, 3, 4, 5],
dif(X, 5),
dif(X, 4),
dif(X, 3).
Result = [one, two, three, 4, 5],
L = [1, 2, 3] ;
Result = [one, two, 3, three, 5],
L = [1, 2, 4] ;
Result = [one, two, 3, 4, three],
L = [1, 2, 5] ;
Result = [one, two, 3, 4, 5],
L = [1, 2, _22546],
dif(_22546, 5),
dif(_22546, 4),
dif(_22546, 3) ;
Result = [one, three, two, 4, 5],
L = [1, 3, 2] ;...and goes on...
until finally terminates (after a lot of answers) deterministicaly
Result = [1, 2, 3, 4, 5],
L = [_23992, _23998, _24004],
dif(_23992, 5),
dif(_23992, 4),
dif(_23992, 3),
dif(_23992, 2),
dif(_23992, 1),
dif(_23998, 5),
dif(_23998, 4),
dif(_23998, 3),
dif(_23998, 2),
dif(_23998, 1),
dif(_24004, 5),
dif(_24004, 4),
dif(_24004, 3),
dif(_24004, 2),
dif(_24004, 1).
?- L=[_,_,_],replace_elements([1,2,3,4,5],[one,two,three,4,5],L,T).
L = [1, 2, 3],
T = [one, two, three] ;
L = [1, 3, 2],
T = [one, three, two] ;
L = [2, 1, 3],
T = [two, one, three] ;
L = [3, 1, 2],
T = [three, one, two] ;
L = [2, 3, 1],
T = [two, three, one] ;
L = [3, 2, 1],
T = [three, two, one] ;
false.
?- replace_elements([1,2,3,4,5],[one,two,three,4,5],Fs,Ts).
Fs = [1, 2, 3],
Ts = [one, two, three] ;
Fs = [1, 2, 3, 4],
Ts = [one, two, three, 4] ;
Fs = [1, 2, 3, 4, 5|_9700],
Ts = [one, two, three, 4, 5|_9706] ;
Fs = [1, 2, 3, 4, _10176],
Ts = [one, two, three, 4, _10218],
dif(_10176, 5) ;
Fs = [1, 2, 3, 4, _10236, 5|_10244],
Ts = [one, two, three, 4, _10284, 5|_10292],
dif(_10236, 5) ;
Fs = [1, 2, 3, 4, _10384, _10390],
Ts = [one, two, three, 4, _10432, _10438],
dif(_10384, 5),
dif(_10390, 5) ;
Fs = [1, 2, 3, 4, ...and goes on...
This relation can be expressed quite compactly with if_/3, =/3 and maplist/3:
:- use_module(library(apply)). % for maplist/3
from_to_elem_repl([],[],E,E).
from_to_elem_repl([X|Xs],[Y|Ys],E,R) :-
if_(E=X,R=Y,from_to_elem_repl(Xs,Ys,E,R)).
from_to_list_mapped(Fs,Ts,L,M) :-
maplist(from_to_elem_repl(Fs,Ts),L,M).
The predicate from_to_elem_repl/4 describes the relation between an element and its replacement. If the element E occurs in the from-list then it's replaced by the element at the corresponding position in the to-list: Y (recursive rule). If E does not occur in the from-list it is not replaced (base case). The predicate from_to_list_mapped/4 uses maplist/3 to map the predicate from_to_elem_repl/4 to the list L thus yielding the list with the replacements M. Your example query succeeds deterministically:
?- from_to_list_mapped([1,2,3],[one,two,three],[1,2,3,4,5],M).
M = [one, two, three, 4, 5].
In the other direction all eight solutions are found:
?- from_to_list_mapped([1,2,3],[one,two,three],L [one,two,three,4,5]).
L = [1, 2, 3, 4, 5] ;
L = [1, 2, three, 4, 5] ;
L = [1, two, 3, 4, 5] ;
L = [1, two, three, 4, 5] ;
L = [one, 2, 3, 4, 5] ;
L = [one, 2, three, 4, 5] ;
L = [one, two, 3, 4, 5] ;
L = [one, two, three, 4, 5].
You could also ask for possible mapping pairs for a given list and its replacement:
?- from_to_list_mapped(Fs,Ts,[1,2,3,4,5],[one,two,three,4,5]).
Fs = [1, 2, 3],
Ts = [one, two, three] ;
Fs = [1, 2, 3, 4],
Ts = [one, two, three, 4] ;
Fs = [1, 2, 3, 4, 5|_G5111],
Ts = [one, two, three, 4, 5|_G5114] ;
Fs = [1, 2, 3, 4, _G5258],
Ts = [one, two, three, 4, _G5279],
dif(_G5258, 5) ;
Fs = [1, 2, 3, 4, _G5275, 5|_G5279],
Ts = [one, two, three, 4, _G5299, 5|_G5303],
dif(_G5275, 5) ;
Fs = [1, 2, 3, 4, _G5316, _G5319],
Ts = [one, two, three, 4, _G5340, _G5343],
dif(_G5316, 5),
dif(_G5319, 5) ;
Fs = [1, 2, 3, 4, _G5333, _G5336, 5|_G5340],
Ts = [one, two, three, 4, _G5360, _G5363, 5|_G5367],
dif(_G5333, 5),
dif(_G5336, 5) ;
.
.
.
Obviously there are infinitely many possibilities. But if you ask for a fixed length, the predicate terminates:
?- Fs=[_,_,_],from_to_list_mapped(Fs,Ts,[1,2,3,4,5],[one,two,three,4,5]).
Fs = [1, 2, 3],
Ts = [one, two, three] ;
Fs = [1, 3, 2],
Ts = [one, three, two] ;
Fs = [2, 1, 3],
Ts = [two, one, three] ;
Fs = [3, 1, 2],
Ts = [three, one, two] ;
Fs = [2, 3, 1],
Ts = [two, three, one] ;
Fs = [3, 2, 1],
Ts = [three, two, one] ;
false.
You can also ask for a mapping without specifying the replacement elements:
?- from_to_list_mapped([1,2,3],Ts,[1,2,3,4,5],R).
Ts = [_G4920, _G4937, _G4965],
R = [_G4920, _G4937, _G4965, 4, 5].
As you see the predicate is quite versatile. Play around with it to find other possible uses.
I'll provide a thought process for solving the problem. A couple of principles would be:
Thinking relationally rather than imperatively
Top down design
You want:
replace_elements(+SearchingElementsList, +ReplacementsList, +OriginalList, -ResultingList).
I'll rename it a little to make it not be as imperative:
translated_list(Trans1, Trans2, List1, List2).
I removed the + and - because, ideally, we'd like this to be as general a relation as possible. This is a relation that the corresponding elements in List1 and List2 are related to each other via the "translation table" defined by corresponding elements in Trans1 and Trans2.
In Prolog, when considering corresponding list elements, that makes me immediately think of using something like maplist. Also, it's awkward handling two independent lists to define a 1-1 relationship between terms. It is easier and cleaner to use a single translation table with elements that look like, say, t1-t2.
translated_list(Trans1, Trans2, List1, List2) :-
% TransTable is a translation table consisting of t1-t2 pairs from Trans1 and Trans2
maplist(trans_table_element, Trans1, Trans2, TransTable),
% List1 and List2 are related using the translation table, TransTable
maplist(corresponding_element(TransTable), List1, List2).
Now we need a predicate trans_table that provides a relationship between translation table elements. This relation says that an element in the translation table is E1-E2 where the corresponding individual elements are E1 and E2:
trans_table_element(E1, E2, E1-E2).
And we need a predicate that describes two corresponding elements using a translation table.
corresponding_element(TransTable, E1, E2) :-
( member(E1-E2, TransTable)
-> true % Translation exists
; E1 = E2 % Translation doesn't exist
).
From this, you get:
| ?- translated_list([1,2,3], [one, two, three], [4,1,3,5,2,1,3], L).
L = [4,one,three,5,two,one,three]
yes
| ?-
As well as:
| ?- translated_list([1,2,3], [one, two, three], L, [4,one,three,5,two,one,three]).
L = [4,1,3,5,2,1,3] ? a
no
And
| ?- translated_list(A, B, [4,1,3,5,2,1,3], [4,one,three,5,two,one,three]).
A = [4,1,3,5,2]
B = [4,one,three,5,two] ? ;
A = [4,1,3,5,2,_]
B = [4,one,three,5,two,_] ? ;
...
If you want to enforce in your rules that the translation table only translates between different elements, then you could define:
trans_table_element(E1, E2, E1-E2) :- dif(E1, E2).
And then you'd get (using SWI Prolog this time):
2 ?- translated_list(A, B, [4,1,3,5,2,1,3], [4,one,three,5,two,one,three]).
A = [1, 3, 2],
B = [one, three, two] ;
A = [1, 3, 2, _1240],
B = [one, three, two, _1276],
dif(_1240, _1276) ;
A = [1, 3, 2, _1492, _1498],
B = [one, three, two, _1534, _1540],
dif(_1492, _1534),
dif(_1498, _1540) ;
...
UPDATE
A possible improvement in the above implementation to make it more relational by avoiding the ->/; construct, we can define non-membership relationally using maplist.
corresponding_element(TransTable, E1, E2) :-
member(E1-E2, TransTable).
corresponding_element(TransTable, E1, E2) :-
maplist(dif(E1-E2), TransTable),
E1 = E2.
In addition to the above results, yields:
6 ?- translated_list([1,2,3],Ts,[1,2,3,4,5],R).
Ts = [_9016, _9034, _9052],
R = [_9016, _9034, _9052, 4, 5] ;
Ts = [_9640, _9646, _9652],
R = [_9640, _9646, 3, 4, 5],
dif(3, _9652) ;
Ts = [_9640, _9646, _9652],
R = [_9640, 2, _9652, 4, 5],
dif(2, _9646) ;
Ts = [_9856, _9862, _9868],
R = [_9856, 2, 3, 4, 5],
dif(2, _9862),
dif(3, _9868)
...

Write a program in mathematica whith Givens rotation

How can I write a program which can solve a system of linear equations with Givens rotation in mathematica .
Code attempt:
ar = CoefficientArrays[
{x + y + z == 2, 3 x - 2 y + z == 4, x - y + 5 z == 6},
{x, y, z}];
an = Normal[ar];
b = an[[2]];
n = Length[b];
Do[Do[a[i, j] = b[[i]][[j]], {j, 1, n}], {i, 1, n}];
r1 = (a[1, 1]^2 + a[1, 2]^2)^(1/2);
c = a[1, 1]/r1;
s = a[1, 2]/r1;
Are you looking for something like this?
Following your code.
{r1, c, s}
{Sqrt[2], 1/Sqrt[2], 1/Sqrt[2]}
{a, b} = LinearSolve[{{c, -s}, {s, c}}, {r1, 0}]
{1, -1}
algorithm from wikipedia
GivensRotation[a_, b_] := Which[
b == 0, c = Sign[a]; s = 0; r = Abs[a],
a == 0, c = 0; s = -Sign[b]; r = Abs[b],
Abs[a] > Abs[b],
t = b/a; u = Sign[a]*Abs[Sqrt[1 + t*t]];
c = 1/u; s = -c*t; r = a*u,
True,
t = a/b;
u = Sign[b]*Abs[Sqrt[1 + t*t]];
s = -1/u; c = -s*t; r = b*u
]
GivensRotation[a, b];
{r, c, s}
{Sqrt[2], 1/Sqrt[2], 1/Sqrt[2]}
Edit
I'm not familiar with solving with Givens rotation. Here are other methods for solving the simultaneous equations, just for interest.
Solve[{
x + y + z == 2,
3 x - 2 y + z == 4,
x - y + 5 z == 6},
{x, y, z}]
{{x -> 1, y -> 0, z -> 1}}
also
LinearSolve[{{1, 1, 1}, {3, -2, 1}, {1, -1, 5}}, {2, 4, 6}]
{1, 0, 1}
or
Inverse[{{1, 1, 1}, {3, -2, 1}, {1, -1, 5}}].{2, 4, 6}
{1, 0, 1}

RecursionLimit while forming lagrangian in modeling of spherical pendulum

I am new to Mathematica and this gives me headache. I was modeling spherical pendulum using rotationary matrices and it gives me reclim exception at forming lagrangian (L=T-V). Any idea where is the recursion and where is the problem? (I studied documentation but i can see nothing helpful there). File: Download
In[55]:= Clear["Global`*"]
p2 = {0, 0, -L}
Out[56]= {0, 0, -L}
In[57]:= R10 = {{Cos[\[Theta][t]], -Sin[\[Theta][t]],
0}, {Sin[\[Theta][t]], Cos[\[Theta][t]], 0}, {0, 0, 1}}
Out[57]= {{Cos[\[Theta][t]], -Sin[\[Theta][t]], 0}, {Sin[\[Theta][t]],
Cos[\[Theta][t]], 0}, {0, 0, 1}}
In[58]:= Grid[R10]
Out[58]= \!\(
TagBox[GridBox[{
{
RowBox[{"Cos", "[",
RowBox[{"\[Theta]", "[", "t", "]"}], "]"}],
RowBox[{"-",
RowBox[{"Sin", "[",
RowBox[{"\[Theta]", "[", "t", "]"}], "]"}]}], "0"},
{
RowBox[{"Sin", "[",
RowBox[{"\[Theta]", "[", "t", "]"}], "]"}],
RowBox[{"Cos", "[",
RowBox[{"\[Theta]", "[", "t", "]"}], "]"}], "0"},
{"0", "0", "1"}
},
AutoDelete->False,
GridBoxItemSize->{
"Columns" -> {{Automatic}}, "ColumnsIndexed" -> {},
"Rows" -> {{Automatic}}, "RowsIndexed" -> {}, "Items" -> {},
"ItemsIndexed" -> {}}],
"Grid"]\)
In[59]:= R21 = {{Cos[\[Phi][t]], 0, -Sin[\[Phi][t]]}, {0, 1,
0}, {Sin[\[Phi][t]], 0, Cos[\[Phi][t]]}}
Out[59]= {{Cos[\[Phi][t]], 0, -Sin[\[Phi][t]]}, {0, 1,
0}, {Sin[\[Phi][t]], 0, Cos[\[Phi][t]]}}
In[60]:= Grid[R21]
Out[60]= \!\(
TagBox[GridBox[{
{
RowBox[{"Cos", "[",
RowBox[{"\[Phi]", "[", "t", "]"}], "]"}], "0",
RowBox[{"-",
RowBox[{"Sin", "[",
RowBox[{"\[Phi]", "[", "t", "]"}], "]"}]}]},
{"0", "1", "0"},
{
RowBox[{"Sin", "[",
RowBox[{"\[Phi]", "[", "t", "]"}], "]"}], "0",
RowBox[{"Cos", "[",
RowBox[{"\[Phi]", "[", "t", "]"}], "]"}]}
},
AutoDelete->False,
GridBoxItemSize->{
"Columns" -> {{Automatic}}, "ColumnsIndexed" -> {},
"Rows" -> {{Automatic}}, "RowsIndexed" -> {}, "Items" -> {},
"ItemsIndexed" -> {}}],
"Grid"]\)
In[61]:= p0 = R10 . R21 . p2
Out[61]= {L Cos[\[Theta][t]] Sin[\[Phi][t]],
L Sin[\[Theta][t]] Sin[\[Phi][t]], -L Cos[\[Phi][t]]}
In[62]:= v0 = D[p0, t]
Out[62]= {-L Sin[\[Theta][t]] Sin[\[Phi][t]] Derivative[1][\[Theta]][
t] + L Cos[\[Theta][t]] Cos[\[Phi][t]] Derivative[1][\[Phi]][t],
L Cos[\[Theta][t]] Sin[\[Phi][t]] Derivative[1][\[Theta]][t] +
L Cos[\[Phi][t]] Sin[\[Theta][t]] Derivative[1][\[Phi]][t],
L Sin[\[Phi][t]] Derivative[1][\[Phi]][t]}
In[63]:= T = 1/2 m v0 . v0 // Simplify
Out[63]= 1/2 L^2 m (Sin[\[Phi][t]]^2 Derivative[1][\[Theta]][t]^2 +
Derivative[1][\[Phi]][t]^2)
In[64]:= V = m {0, 0, g} . p0
Out[64]= -g L m Cos[\[Phi][t]]
In[65]:= L = T - V
During evaluation of In[65]:= $RecursionLimit::reclim: Recursion depth of 1024 exceeded. >>
Out[65]= Hold[g L m Cos[\[Phi][t]]]

Resources