如何用SciPy和Delphi进行超高速科学计算

540 阅读4分钟

你想用Python脚本编写器建立一个具有科学计算能力的GUI应用程序吗?这篇文章将帮助你了解如何在Delphi/C++应用程序中使用Python4DelphiSciPy库。SciPy是建立在Python的NumPy扩展上的数学算法和便利函数的集合。

SciPy被组织成涵盖不同科学计算领域的子包,如集群、特殊、集成、优化、插值、Linalg等。

Python for Delphi (P4D)是一套免费的组件,将Python DLL包装到Delphi和Lazarus (FPC)中。它们让你轻松地执行Python脚本,创建新的Python模块和新的Python类型。你可以以多种不同的方式使用Python4Delphi,如:。

  • 围绕你现有的Python应用程序创建一个Windows GUI。
  • 将Python脚本添加到你的Delphi Windows应用程序中。
  • 通过Delphi线程为你的Python应用程序添加并行处理。
  • 用Delphi的函数增强你的速度敏感型Python应用程序,以提高速度。

使用SciPy和Delphi的先决条件是什么?

  • 如果你的机器上没有安装Python和Python4Delphi,请看看如何使用Python4Delphi示例程序在Delphi应用程序中运行一个简单的Python脚本
  • 打开窗口打开命令提示符,然后输入pip install -U SciPy 来安装 SciPy。关于安装Python模块的更多信息,请看这里
  • 首先,运行Demo1项目,在Python for Delphi中执行Python脚本。然后在Memo1区域加载SciPy示例脚本,并按下执行脚本 按钮来查看结果。在点击执行 按钮时,脚本字符串将使用以下代码执行。请到GitHub下载**Demo1**的源代码。
procedure TForm1.Button1Click(Sender: TObject);
begin
 PythonEngine1.ExecStrings( Memo1.Lines );
end;

使用Scipy Python库的例子是什么样子的?

下面是Scipy Python库的示例脚本细节。它涵盖了一些SciPy子包的功能,如贝塞尔、积分、内插和优化。

import numpy as np
from scipy import special
def drumhead_height(n, k, distance, angle, t):
   kth_zero = special.jn_zeros(n, k)[-1]
   return np.cos(t) * np.cos(n*angle) * special.jn(n, distance*kth_zero)
theta = np.r_[0:2*np.pi:50j]
radius = np.r_[0:1:50j]
x = np.array([r * np.cos(theta) for r in radius])
y = np.array([r * np.sin(theta) for r in radius])
z = np.array([drumhead_height(1, 1, r, theta, 0.5) for r in radius])

#show in the matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
fig = plt.figure()
ax = Axes3D(fig, rect=(0, 0.05, 0.95, 0.95))
ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='RdBu_r', vmin=-0.5, vmax=0.5)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xticks(np.arange(-1, 1.1, 0.5))
ax.set_yticks(np.arange(-1, 1.1, 0.5))
ax.set_zlabel('Z')
plt.show()

#Integration
import scipy.integrate as integrate
import scipy.special as special
result = integrate.quad(lambda x: special.jv(2.5,x), 0, 4.5)
print(result)

#Optimization
from scipy.optimize import minimize
def rosen(x):
    """The Rosenbrock function"""
    return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead',
               options={'xatol': 1e-8, 'disp': True})
print(res.x)

#interpolation
from scipy.interpolate import interp1d
x = np.linspace(0, 10, num=11, endpoint=True)
y = np.cos(-x**2/9.0)
f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')

xnew = np.linspace(0, 10, num=41, endpoint=True)
import matplotlib.pyplot as plt
plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')
plt.legend(['data', 'linear', 'cubic'], loc='best')
plt.show()

SciPy.Special子包是做什么的?

  • 该软件包的主要特点是scipy.special包的主要特点是定义了许多数学物理学的特殊函数。可用的函数包括airy, elliptic, bessel, gamma, beta, hypergeometric, parabolic cylinder, mathieu, spheroidal wave, struve, and kelvin。
  • 贝塞尔函数是贝塞尔微分方程的一系列解,有实数或复数阶α。这些函数出现在波的传播问题中,比如薄鼓头的振动模式。下面是一个圆形鼓头固定在边缘的例子。

scipydemo-5197852

SciPy特殊函数演示

什么是SciPy.Integrate子包?

  • scipy.integrate子包提供了几种积分技术,包括一个常微分方程积分器。
  • 提供的函数quad是为了在两点之间积分一个变量的函数。例如,沿区间[0,4.5]积分贝塞尔函数jv(2.5, x) 。可以用quad ,结果如Memo输出所示。

什么是SciPy.Optimize子包,它是做什么的?

  • scipy.optimize包提供了几种常用的优化算法。为了演示最小化功能,考虑最小化N个变量的Rosenbrock函数的问题。scipyminimize这个函数的最小值是0,当xi=1时就能实现。
  • minimize 例程与Nelder-Mead 单纯算法(通过method 参数选择)一起使用,结果如Memo输出中所示。

SciPy.Interpolate子包的功能是什么?

  • interp1d 类中的scipy.interpolate中的类是一种方便的方法,可以根据固定的数据点创建一个函数,该函数可以使用线性插值在给定数据定义的域内的任何地方进行评估。这个例子演示了它的使用,用于线性和立方样条插值。

scipyinterpolation-8196415

SciPy插值演示

注意:用于演示的样本是从这里挑出来的,只有打印输出的区别。你可以在同一个地方查看API和一些更多的样本。