标签: numerical-methods

在Python中使用隐式Euler解决PDE-错误的输出

我将尝试解释发生的情况和问题。

这有点数学,因此不支持乳胶,因此遗憾的是我不得不求助于图像。我希望可以。

enter image description here

enter image description here

我不知道为什么要倒转,对此感到抱歉。无论如何,这是一个线性系统Ax = b,我们知道A和b,因此我们可以找到x,这是我们在下一个时间步长上的近似值。我们将继续执行直到时间t_final。

这是代码

import numpy as np

tau = 2 * np.pi
tau2 = tau * tau
i = complex(0,1)

def solution_f(t, x):
    return 0.5 * (np.exp(-tau * i * x) * np.exp((2 - tau2) * i * t) + np.exp(tau * i * x) * np.exp((tau2 + 4) * i * t))

def solution_g(t, x):
    return 0.5 * (np.exp(-tau * i * x) * np.exp((2 - tau2) * i * t) - np.exp(tau * i * …
Run Code Online (Sandbox Code Playgroud)

python algorithm numerical-methods pde

14
推荐指数
2
解决办法
293
查看次数

有效地确定多项式在区间[0,T]中是否有根

我有非平凡度(4+)的多项式,需要鲁棒有效地确定它们是否在区间[0,T]中有根.根的确切位置或数量与我无关,我只需要知道是否至少有一个.

现在我正在使用区间运算作为快速检查,看看我是否可以证明没有根可以存在.如果我不能,我正在使用Jenkins-Traub来解决所有多项式根.这显然是低效的,因为它检查所有真正的根并找到它们的确切位置,这些信息我最终不需要.

我应该使用标准算法吗?如果没有,在完成所有根的完整Jenkins-Traub求解之前,我还能做任何其他有效的检查吗?

例如,我可以做的一个优化是检查我的多项式f(t)在0和T处是否具有相同的符号.如果不是,则在该区间中显然存在根.如果是这样,我可以求解f'(t)的根,并在区间[0,T]中的f'的所有根处求f.当且仅当所有这些评估具有与f(0)和f(T)相同的符号时,f(t)在该区间中没有根.这减少了我必须根找到的多项式的次数.不是一个巨大的优化,但也许比没有好.

math polynomial-math numerical-methods

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

采样三角形中的随机点

假设你有一个顶点的三角形任意A,BC.本文(第4.2节)说,你可以通过以下顶点的凸组合P从三角形内均匀地生成一个随机点ABC:

P = (1 - sqrt(r1)) * A + (sqrt(r1) * (1 - r2)) * B + (sqrt(r1) * r2) * C
Run Code Online (Sandbox Code Playgroud)

在哪里r1r2均匀地绘制[0, 1],并且sqrt是平方根函数.

你如何证明在三角形内均匀分布的采样点ABC

编辑

正如在mathoverflow问题的评论中所指出的, Graphical Gems讨论了这种算法.

algorithm geometry numerical-methods sampling

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

Scala的数值库

我正在寻找一个可以在Scala中进行数值计算的库(或Java,虽然可以使用scala函数的东西会更好!)至少具有以下功能:

  • L-BFGS
  • 最小化器(Powell,QuasiNewton,......)
  • 多变量函数的数值微分
  • 数值积分(不是绝对必要但非常优选)

我也只是寻找积极维护的东西(最早在2011年最新更新),最好但不一定是免费的.此外,还需要数值稳定性,即所有操作都应以尽可能保持精度的一致结果的方式实现.

我已经知道IMSL,但更喜欢别的东西.

提前致谢

java math optimization scala numerical-methods

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

如何在gnuplot中绘制图形的导数?

我有一组随时间变化的变量.我将这些测量结果放在一个名为"results"的文件中,格式如下:

# time sample
0      5
12     43
234    342
Run Code Online (Sandbox Code Playgroud)

等等...

我可以在gnuplot中轻松地绘制这个:

plot "results"
Run Code Online (Sandbox Code Playgroud)

有什么方法来绘制这些测量的导数与直接从gnuplot的关于时间(即dsample/DT),或者我要单独计算的导数和情节直接在gnuplot的?

gnuplot numerical-methods

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

Python中的数值ODE求解

我如何在Python中用数字解决ODE?

考虑

等式来解决

\ddot{u}(\phi) = -u + \sqrt{u}
Run Code Online (Sandbox Code Playgroud)

具备以下条件

u(0) = 1.49907
Run Code Online (Sandbox Code Playgroud)

\dot{u}(0) = 0
Run Code Online (Sandbox Code Playgroud)

有约束

0 <= \phi <= 7\pi.
Run Code Online (Sandbox Code Playgroud)

最后,我想生成一个参数图,其中x和y坐标是作为u的函数生成的.

问题是,我需要运行odeint两次,因为这是二阶微分方程.我试过让它在第一次运行后再次运行,但它回来时出现雅可比错误.必须有一种方法可以同时运行它两次.

这是错误:

odepack.error:该函数及其雅可比行列式必须是可调用函数

以下代码生成的代码.有问题的行是sol = odeint.

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from numpy import linspace


def f(u, t):
    return -u + np.sqrt(u)


times = linspace(0.0001, 7 * np.pi, 1000)
y0 = 1.49907
yprime0 = 0
yvals = odeint(f, yprime0, times)

sol = odeint(yvals, y0, times)

x = 1 / sol * …
Run Code Online (Sandbox Code Playgroud)

python plot numerical-methods differential-equations

13
推荐指数
1
解决办法
4万
查看次数

Scheme/Common Lisp/Clojure中的自动差异库

我听说McCarthy发明Lisp的原始动机之一是编写一个自动区分系统.尽管如此,我的Google搜索还没有为此做出任何库/宏.是否有任何Scheme/Common Lisp/Clojure库(宏)用于获取函数F并返回计算F的导数的函数dF/dx?

我希望它能用多个参数支持F'.用户可以选择哪个是x来区分.理想情况下,微分器甚至可以用于矢量值F和x.

编辑:有几个人提到了象征性的差异化.符号微分和自动微分之间的区别是微妙的,但它在维基百科中得到了很好的总结,特别是在这张图片中.这种区别在lisp中并不那么强烈,其中符号表达式可以按原样转换为工作程序,但仍存在潜在的困难:

符号微分要求表达式被区分为由具有已知衍生物的操作组成.例如,有人提到了SICP的一个宏的例子,它通过简单的性行为进行搅拌(+ y (* (x y))),并使用链规则,以及如何区分+*返回代表衍生物的性别的知识.我需要使用表达式,例如(* (foo x y) (bar x)),where foobarmay可以依次调用其微分时间不知道其衍生物的其他函数.

如果有采取类似的表达方式,这将是罚款(foo x y),并以其函数体替换,替换参数中的任何提及与xy在卫生型的方式.在那儿?

此外,上述任何一个都没有解决在将向量值函数与向量值参数区分开来时出现的复杂情况......这是大多数自动微分实现的适应性.

lisp scheme clojure automatic-differentiation numerical-methods

12
推荐指数
2
解决办法
2829
查看次数

使用CUDA计算数百个小矩阵的特征值/特征向量

我有一个关于使用CUDA对数百个小矩阵进行特征分解的问题.

我需要同时计算数百(例如500)小(64乘64)实对称矩阵的特征值和特征向量.我试图通过Jacobi方法使用国际象棋锦标赛订购来实现它(有关更多信息,请参阅本文(PDF)).

在该算法中,在每个块中定义了32个线程,而每个块处理一个小矩阵,并且32个线程一起工作以使32个非对角线元素膨胀直到收敛.但是,我对它的表现并不十分满意.

我想知道我的问题哪里有更好的算法,即许多64乘64实对称矩阵的特征分解.我想家庭主人的方法可能是更好的选择,但不确定它是否可以在CUDA中有效实施.网上没有很多有用的信息,因为大多数其他程序员更感兴趣的是使用CUDA/OpenCL来分解一个大矩阵而不是很多小矩阵.

cuda matrix linear-algebra opencl numerical-methods

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

Bezier Cubic Curves:以均匀的加速度移动

假设我有一个贝塞尔曲线 B(u),如果我u以恒定速率增加参数,我不会沿着曲线获得恒定的速度运动,因为u参数和评估曲线的点之间的关系不是线性的.

我已阅读并实施了David Eberly的文章.它解释了如何沿参数曲线以恒定速度移动.

假设我有一个函数F(t),它将时间值t和速度函数作为输入,在时间sigma返回速度值t,我可以获得沿曲线的恒定速度运动,以恒定速率改变t参数:B(F(t))

我正在使用的文章的核心是以下功能:

float umin, umax; // The curve parameter interval [umin,umax].
Point Y (float u); // The position Y(u), umin <= u <= umax.
Point DY (float u); // The derivative dY(u)/du, umin <= u <= umax.
float LengthDY (float u) { return Length(DY(u)); }
float ArcLength (float t) { return Integral(umin,u,LengthDY()); }
float L = ArcLength(umax); // The …
Run Code Online (Sandbox Code Playgroud)

3d bezier numerical-methods runge-kutta

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

任意曲线的递归弧长重新参数化

我有一个3D参数曲线,定义为P(t)= [x(t),y(t),z(t)]

我正在寻找一种功能,可以根据弧长重新设置此曲线的参数。我正在使用OpenSCAD,这是一种没有变量的声明性语言(仅常数),因此解决方案需要递归工作(除了全局常量和函数参数外,没有变量)。

更准确地说,我需要编写一个函数Q(s),以给出P上的点,该点沿t到t = 0的点沿弧线的距离(大约)为s。我已经有一些可用于答案的数字积分和微分函数。

任何建议将不胜感激!

ps在OpenSCAD中不可能将函数作为参数传递,我通常仅通过使用全局声明来解决此问题。

functional-programming numerical-methods parametric-equations openscad

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