有没有一种简单的方法可以用 Tikz-PGF 绘制雅可比椭圆函数?

有没有一种简单的方法可以用 Tikz-PGF 绘制雅可比椭圆函数?

因此,雅可比椭圆函数的绘制有点棘手,因为它们依赖于第一类的完全椭圆积分K(k),可以写成双阶乘的和,而雅可比椭圆函数的傅里叶级数则依赖于这些椭圆积分的指数,我可以轻松写出所有数学公式,但我不知道在 Tikz 或 PGF 上表示它们的简单方法,可能 gnuplot 是最简单的,但我想让它只依赖于 Tikz PGF,因为我在使用 gnuplot 时遇到了配置问题,我想以公式形式而不是表格形式来写它,因为我想轻松地将参数从一个编译更改为另一个编译。

基本上,有没有办法在 Tikz - PGF 中计算某些变量的总和和双阶乘,然后将它们用在依赖于这些变量的函数图中?

基本上我需要一种计算方法:

K(k) = pi/2 sum[n=0:10] ((( 2 * n - 1)!!)/((2 * n)!!)) * (k^(2*n)) 

对于给定的uv= sqrt(1-u^2)

q = exp(-pi * (K(v)/K(u))) 

计算并绘制例如:

sn_u(x) = (2* pi/(K(u) * u)) * sum[n=0:5] (((q^(n+0.5)) * sin((2*n+1) * x * pi/(2 * K(u))))/(1-(q^(2n+1))))

如何将这些总和和双阶乘作为函数实现?还有没有办法按照我编写的方式将这些计算模块化?

答案1

由于我的数学能力有限,我无法透露更多。

以下不完整的代码渐近线,可以编译 http://asymptote.ualberta.ca/

import graph;
import gsl; // https://github.com/vectorgraphics/asymptote/blob/master/gsl.cc
// 1086 addGSLDOUBLEFunc<gsl_sf_ellint_Kcomp>(SYM(K),SYM(k));
// in asy code, it is 'real K(real k)'
// for gsl_sf_ellint_Kcomp, see 
// https://www.gnu.org/software/gsl/doc/html/specfunc.html?highlight=bessel#c.gsl_sf_ellint_Kcomp and 
// https://www.gnu.org/software/gsl/doc/html/specfunc.html?highlight=gsl_prec_double#c.gsl_mode_t.GSL_PREC_DOUBLE

size(350,200,false);

real q(real k){ return exp(-pi*(K(sqrt(1-k^2))/K(k)));}

typedef real newreal(real);

// Define the function "sn_u(real k, int n)"
newreal sn_u(real k, int n){
  return new real(real x)
  {
    real createfunction(int n)
    {
      return ((q(k)^(n+0.5)) * sin((2*n+1) * x * pi/(2 * K(k))))/(1-(q(k)^(2n+1)));
    }
    return (2*pi)/(K(k)*k)*sum(sequence(createfunction,n));
  // See T[] sequence(T f(int), int n) and T sum(T[] a)
  // in 6.12 Arrays of the documentation.
  };
}

// the graph
guide g=graph(sn_u(0.95,6),-10,10,350);
draw(g);

label("$u=0.95$, n from 0 to 5",(5,0.5));

// for axes
xaxis(Label("$x$",position = EndPoint, align=NE),
      xmin=-10,
      Ticks(scale(.7)*Label(),
            NoZero, end=false, Step=1, Size=.8mm, size=.4mm,
            pTick=black),
            Arrow);

yaxis(Label("$y$",position = EndPoint, align=NE),
      ymin=-1,ymax=1,
      Ticks(scale(.7)*Label(),
            NoZero, begin=false, end=false, Step=1, Size=.8mm, size=.4mm,
            pTick=black),
      Arrow);

在此处输入图片描述

答案2

这是我的解决方案,有点晚了。

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\begin{document}
     \begin{tikzpicture}[
     declare function={
        K(\u) = pi/2*(1+(\u^2)/4+9*(\u^4)/64+25*(\u^6)/(16*16));
        I(\x,\i)=((e^(-(\i+0.5)*pi*K(0.3)/K(0.95)))*sin(deg((2*\i+1)*\x*pi/(2*K(0.95)))))/(1-(e^(-(2*\i+1)*pi*K(0.3)/K(0.95))));
        sn(\x)=2*pi/(0.95*K(0.95))*(I(\x,0)+I(\x,1)+I(\x,2)+I(\x,3)+I(\x,4)+I(\x,5));
    }
    ]
    \begin{axis}[
        axis lines = middle,
        axis equal image,
        xlabel = $x$,
        ylabel = {$y$},
        domain=-5:5,
        ymax=2,ymin=-2,
        samples=100,
        grid=major,
        ]
        \addplot [color=blue] {sn(x)};
    \end{axis}
\end{tikzpicture}
\end{document}

相关内容