标签: physics

如何在 Python 中随机分布 N 个质量,使它们遵循 Plummer 密度分布

我正在用Python工作。我有N星星,每颗星星的质量都是一个太阳质量M_0。我想将这些恒星随机分布在半径为 的体积中R,使得密度分布遵循普卢默模型,由以下公式给出:

在此输入图像描述

我知道M在这种情况下这是总簇质量M=NM_0,但不确定我将如何编码这种质量分布。

python physics

2
推荐指数
1
解决办法
1775
查看次数

计算 3-D 旋度的最快算法

我正在尝试编写一段代码,用于在周期性边界条件下以二阶数值计算向量场的旋度。然而,我制作的算法非常慢,我想知道是否有人知道任何替代算法。

给出更具体的上下文:我使用 3xAxBxC numpy 数组作为向量场,其中第一个轴指的是笛卡尔方向 (x,y,z),A、B、C 指的是该笛卡尔方向上的 bin 数量(即决议)。例如,我可能有一个向量场 F = np.zeros((3,64,64,64)),其中 Fx = F[0] 本身就是一个 64x64x64 笛卡尔晶格。到目前为止,我的解决方案是使用 3 点中心差分模板来计算导数,并使用嵌套循环来使用模块化算术迭代所有不同的维度,以强制执行周期性边界条件(例如见下文)。然而,随着我的分辨率增加(A、B、C 的大小),这开始需要很长时间(最多 2 分钟,如果我为模拟执行数百次,这就会增加 - 这只是一个小部分)更大的算法)。我想知道是否有人知道执行此操作的替代方法?

import numpy as np

F =np.array([np.ones([128,128,128]),2*np.ones([128,128,128]),
               3*np.ones([128,128,128])])


VxF =np.array([np.zeros([128,128,128]),np.zeros([128,128,128]),
               np.zeros([128,128,128])])

for i in range(0,128):
     for j in range(0,128):
          for k in range(0,128):
           VxF[0][i,j,k] = 0.5*((F[2][i,(j+1)%128,k]-
                    F[2][i,j-1,k])-(F[1][i,j,(k+1)%128]-F[1][i,j,k-1]))
           VxF[1][i,j,k] = 0.5*((F[0][i,j,(k+1)%128]-
                    F[0][i,j,k-1])-(F[2][(i+1)%128,j,k]-F[2][i-1,j,k]))
           VxF[2][i,j,k] = 0.5*((F[1][(i+1)%128,j,k]-
                    F[1][i-1,j,k])-(F[0][i,(j+1)%128,k]-F[0][i,j-1,k]))
Run Code Online (Sandbox Code Playgroud)

重申一下,我正在寻找一种算法,该算法可以比我现有的算法更快地在给定周期性边界条件的情况下将向量场数组的旋度计算为二阶。也许没有什么可以做到这一点,但我只想在继续花时间运行这个算法之前检查一下。感谢。大家提前!

python algorithm physics numerical-computing numerical-methods

2
推荐指数
1
解决办法
697
查看次数

solve_ivp 错误:“所需的步长小于数字之间的间距。”

一直试图使用 scipy 中的 RK45 来解决牛顿二体问题,但是不断遇到 TypeError:“所需步长小于数字之间的间距。” 我尝试了与下面不同的 t_eval 值,但似乎没有任何效果。

from scipy import optimize
from numpy import linalg as LA
import matplotlib.pyplot as plt
from scipy.optimize import fsolve
import numpy as np
from scipy.integrate import solve_ivp

AU=1.5e11
a=AU
e=0.5
mss=2E30
ms = 2E30
me = 5.98E24
mv=4.867E24
yr=3.15e7
h=100
mu1=ms*me/(ms+me)
mu2=ms*me/(ms+me)
G=6.67E11
step=24

vi=np.sqrt(G*ms*(2/(a*(1-e))-1/a))
#sun=sphere(pos=vec(0,0,0),radius=0.1*AU,color=color.yellow)
#earth=sphere(pos=vec(1*AU,0,0),radius=0.1*AU)

sunpos=np.array([-903482.12391302, -6896293.6960525, 0.  ])
earthpos=np.array([a*(1-e),0,0])

earthv=np.array([0,vi,0])
sunv=np.array([0,0,0])





def accelerations2(t,pos):
    norme=sum( (pos[0:3]-pos[3:6])**2 )**0.5
    gravit = G*(pos[0:3]-pos[3:6])/norme**3
    sunaa = me*gravit
    earthaa = -ms*gravit
    tota=earthaa+sunaa
    return [*earthaa,*sunaa]

def …
Run Code Online (Sandbox Code Playgroud)

physics typeerror runge-kutta

2
推荐指数
1
解决办法
9414
查看次数

了解自适应龙格库塔积分器的局部截断误差

我正在实现一个 RKF4(5) 积分器,我无法确定我的代码是否正常工作并且我不明白本地截断错误,或者我的代码是否无法正常工作。

对于代码块的大小,我深表歉意,但在这种情况下,最小可重现示例相当大。

import numpy as np

def RKF45(state, derivative_function, h):
    """
    Calculate the next state with the 4th-order calculation, along with a 5th-order error
    check.

    Inputs:
    state: the current value of the function, float
    derivative_function: A function which takes a state (given as a float)
                         and returns the derivative of a function at that point
    h: step size, float
    """
    k1 = h * derivative_function(state)
    k2 = h * derivative_function(state + (k1 / 4))
    k3 = h * …
Run Code Online (Sandbox Code Playgroud)

python physics numerical-methods numerical-integration runge-kutta

2
推荐指数
1
解决办法
826
查看次数

以弧度/秒设定速度时,任何半径的车轮恒速?

在box2d物理引擎中,我可以以Radians/Second为我的车轮上的关节设置电机速度.

什么是表达式我可以设置速度,所以无论车轮半径如何,车轮的最终实际"速度"都是相同的.

目前,我将车轮速度设置为常数,wheelSpeed = 20.但这样可以使大轮子比小轮子更快.我希望半径用于计算电机速度的弧度/秒,因此我将获得相同的有效速度.

所以,如果它是一个小轮子,它必须比一个大轮子更频繁地转动.

我想我需要做2*PI*Radius/180*Speed这样的事情?或类似的东西,但我无法弄明白.

我想基于车轮电机速度(以弧度/秒为单位),因此无论车轮的尺寸如何,车轮的最终"速度"都是恒定的.

math physics box2d

1
推荐指数
1
解决办法
900
查看次数

改变圆周运动的速度

我正在寻找一种平稳增加或减少圆周运动速度的方法.

使用圆的参数方程,我可以随时间移动圆中的对象:

x = center_x + radius * sin(time * speed)
y = center_y + radius * cos(time * speed)
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于我不能简单speed = speed + 1地加速对象,因为它会导致不稳定的运动.这是有道理的,因为基于绝对值而不是相对于对象的先前位置,每帧重新计算x和y值.

另一种方法可能是使用表示对象速度的向量,然后对向量应用圆周运动:

v_x = radius * sin(time * speed)
v_y = radius * cos(time * speed)
x = x + v_x
y = y + v_y
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,如果我改变速度,那么半径将增大或缩小.这是有道理的,因为运动是相对于当前位置的,所以如果我改变速度,基本上会跳过时间.

我能想到的一个可能有用的实现是使用从对象指向圆心的向量.然后我可以通过使用垂直向量计算对象位置处圆的切线,对其进行归一化并按速度进行缩放.我还没有实现这个,因为对于像这样的问题似乎有些过分,所以如果存在更简单的解决方案,请告诉我.谢谢!

simulation performance geometry physics

1
推荐指数
1
解决办法
2214
查看次数

如何使用HTML5 Canvas为轨道中的对象设置动画?

让我们说我已经绘制了所有的物体,中间的太阳和行星的几个圆圈.有人可以告诉我如何让这些物体以循环方式移动吗?我不需要任何重力等但我想这可能是一个甜蜜的奖金!

谢谢 :)

html5 physics canvas game-physics

1
推荐指数
1
解决办法
6037
查看次数

寻找3D速度矢量

如何找到3D速度矢量?我有起始位置,结束位置和弹丸的速度.

另外,如果目标移动,我如何找到速度矢量?

任何帮助深表感谢.

c++ math 3d physics vector

1
推荐指数
1
解决办法
7216
查看次数

你如何在另一个向量上反映一个向量?

我正在使用AS3为Flash游戏编写一些碰撞检测程序,并且无法弄清楚如何从一条线上弹出一个球.我跟踪一个代表球的2D速度的矢量,我试图将其反射到垂直于球与之碰撞的线(也就是正常线)的矢量上.我的问题是我不知道如何找出新的向量(这反映在正常情况下).我想你可以使用Math.atan2找到法线和球的矢量之间的差异,但我不知道如何扩展它来解决我的问题.

physics vector actionscript-3

1
推荐指数
1
解决办法
1623
查看次数

使用C#获取一个在Unity3D中摆动的对象

我想在Unity3D中模拟一艘船.我需要它能够做的就像真正的船只在水中碰到某些东西时会摇晃.我已经把船碰撞了,所有的轴都解锁了.然而,这意味着船将旋转,然后继续以奇怪的角度行驶(就像面向天空).

有没有办法让船试图恢复原来的旋转,没有捕捉到确切的值,而只是前后"摇摆",然后放慢速度,最终再次停止正确的旋转?


这是我尝试使用的代码:

void FixedUpdate ()
{
    wobble();
}

void wobble()
{
    if (this.transform.eulerAngles.x < 270)
    {
        this.rigidbody.AddTorque((float)19, (float)0, (float)0, ForceMode.Force);
    }
    else if (this.transform.eulerAngles.x > 270)
    {
        this.rigidbody.AddTorque((float)-19, (float)0, (float)0, ForceMode.Force);
    }
    else{}

    if (this.transform.eulerAngles.z < 0)
    {
        this.rigidbody.AddTorque((float)19, (float)0, (float)0, ForceMode.Force);
    }
    else if (this.transform.eulerAngles.z > 0)
    {
        this.rigidbody.AddTorque((float)-19, (float)0, (float)0, ForceMode.Force);
    }
    else{}
}
Run Code Online (Sandbox Code Playgroud)

但是,现在当我的物体碰到某物时,它就会开始失控.有任何想法吗?

c# physics unity-game-engine

1
推荐指数
1
解决办法
5578
查看次数