r, theta = symbols('r, theta') x, y = symbols('x, y') m = Manifold('M', 2) # 定义一个patch patch = Patch('P', m) # 为这个patch建立坐标系,一个是笛卡尔,一个是极坐标 rect: CoordSystem = CoordSystem('rect', patch) polar = CoordSystem('polar', patch) # print(rect in patch.coord_systems) # 建立两个坐标系之间的转换关系,逆变换是自动的。 # 这个地方,如果笛卡尔是3维,另一个是2维曲面(但是也用u,v,不用极坐标,那会怎么样呢?) polar.connect_to(rect, [r, theta], [r * cos(theta), r * sin(theta)]) # t = polar.coord_tuple_transform_to(rect, [1, pi]) # 极坐标存在奇点,r = 0时,其他怎么取都是0 t = polar.coord_tuple_transform_to(rect, [0, pi]) print(t) t = polar.coord_tuple_transform_to(rect, [2, pi / 2]) print(t) t = rect.coord_tuple_transform_to(polar, [0, 2]) print(t) # 雅克比矩阵。极坐标到笛卡尔坐标系的变换矩阵函数,在每个点,是可以求出一个具体的矩阵的 # 但整体来说是一个函数。 m = polar.jacobian(rect, [r, theta]) print(m) plot_latex(latex(m)) # 笛卡尔坐标系到笛卡尔坐标系的雅克比矩阵是单位矩阵 m = rect.jacobian(rect, [x, y]) # plot_latex(latex(m))
from sympy.diffgeom import Manifold, Patch, CoordSystem from sympy.simplify import simplify r, theta = symbols('r, theta') m = Manifold('M', 2) patch = Patch('P', m) rect = CoordSystem('rect', patch) polar = CoordSystem('polar', patch) print(rect in patch.coord_systems) polar.connect_to(rect, [r, theta], [r*cos(theta), r*sin(theta)]) print(polar.coord_tuple_transform_to(rect, [0, 2])) print(polar.coord_tuple_transform_to(rect, [2, pi/2])) print(rect.coord_tuple_transform_to(polar, [1, 1]).applyfunc(simplify)) print(polar.jacobian(rect, [r, theta])) p = polar.point([1, 3*pi/4]) print(rect.point_to_coords(p)) print(rect.coord_function(0)(p)) print(rect.coord_function(1)(p)) v_x = rect.base_vector(0) x = rect.coord_function(0) print(v_x(x)) print(v_x(v_x(x)))
from sympy import symbols, sin, cos, pi from sympy.diffgeom import Manifold, Patch, CoordSystem r, theta = symbols('r, theta') m = Manifold('M', 2) patch = Patch('P', m) rect = CoordSystem('rect', patch) polar = CoordSystem('polar', patch) rect in patch.coord_systems polar.connect_to(rect, [r, theta], [r*cos(theta), r*sin(theta)]) polar.coord_tuple_transform_to(rect, [0, 2]) polar.coord_tuple_transform_to(rect, [2, pi/2]) rect.coord_tuple_transform_to(polar, [1, 1]) polar.jacobian(rect, [r, theta]) p = polar.point([1, 3*pi/4]) rect.point_to_coords(p) #Define a basis scalar field (i.e. a coordinate function), that takes a point and returns its coordinates. It is an instance of BaseScalarField. rect.coord_function(0)(p) rect.coord_function(1)(p) #Define a basis vector field (i.e. a unit vector field along the coordinate line). Vectors are also differential operators on scalar fields. It is an instance of BaseVectorField. v_x = rect.base_vector(0) x = rect.coord_function(0) v_x(x) v_x(v_x(x)) #Define a basis oneform field: dx = rect.base_oneform(0) dx(v_x) #If you provide a list of names the fields will print nicely: - without provided names: x, v_x, dx #with provided names rect = CoordSystem('rect', patch, ['x', 'y']) rect.coord_function(0), rect.base_vector(0), rect.base_oneform(0)