跳转至内容

分形/数学/向量场

来自维基教科书,开放世界开放书籍

向量场[1]

这里主要描述了与时间无关的二维向量场的数值方法。


  • 向量函数是一个给出向量作为输出的函数
  • 场:空间(平面,球体,...)
  • 场线是一条始终与给定向量场相切的线
  • 标量/向量/张量
    • 标量是在线性代数中使用的实数。标量是零阶张量
    • 向量是一阶张量。向量是标量的扩展
    • 张量是向量的扩展

二维向量的形式:[2]

  • [z1](当第一个点已知时,只有一个复数,例如 z0 是原点
  • [z0, z1] = 两个复数
  • 4 个标量(实数)
    • [x, y, dx , dy]
    • [x0, y0, x1, y1]
    • [x, y, 角度, 大小]
  • 2 个标量:当第一个点已知时,[x1, y1] 用于第二个复数,例如 z0 是原点

函数的数值梯度

  • "是一种使用已知函数在某些点的值来估计每个维度上偏导数的值的方法。"[3]


函数 f 在点 (x0,y0) 处的梯度函数 G

  G(f,x0,y0) = (x1,y1)

输入

  • 函数 f
  • 点 (x0,y0),计算梯度

输出

  • 从 (x0,yo) 到 (x1,y1) 的向量 = 梯度

计算:[4]

  • "梯度计算为:(f(x + h) - f(x - h)) / (2*h),其中 h 是一个小的数字,通常为 1e-5,f(x) 将对每个输入元素进行调用,并带有 +h 和 -h 扰动。对于梯度检查,建议使用 float64 类型以确保数值精度。"[5]
  • 在 matlab 中[6][7]
  • 在 R 中[8]
  • python[9]
ODE means Ordinary Differential Equation, where "ordinary" means with derivative respect to only one variable (like ), as opposed to an equation with partial derivatives (like , , ...) called PDE. (matteo.basei)

字段类型

[编辑 | 编辑源代码]

分类标准


力类型 A 重力场

  • 场线是 的解
  • 测试质量的轨迹是 的解

其中

  • g 是标准重力
  • m 是质量
  • F 是力场


电场

  • 场线是点正电荷在电场作用下被迫移动时所遵循的路径。由于静止电荷引起的场线具有几个重要特性,包括始终从正电荷起源并终止于负电荷,它们以直角进入所有良导体,并且它们从不交叉或自闭。  场线是一个代表性概念;场实际上渗透了线之间所有介于线之间的空间。根据需要代表场的精度,可以绘制更多或更少的线。对由静止电荷产生的电场的研究称为静电学。


    • 平面(参数平面或动态平面)
    • 标量函数
    • 向量函数
  • 使用标量函数(势)创建标量场
  • 使用向量函数(势的梯度)从标量场创建向量场
  • 计算


//https://editor.p5js.org/ndeji69/sketches/EA17R4HHa
// p5 js Tutorial】Swirling Pattern using Gradient for Generative Art by Nekodigi

//get gradient vector
function curl(x, y){
  var EPSILON = 0.001;//sampling interval
  //Find rate of change in X direction
  var n1 = noise(x + EPSILON, y);
  var n2 = noise(x - EPSILON, y);
  //Average to find approximate derivative
  var cx = (n1 - n2)/(2 * EPSILON);

  //Find rate of change in Y direction
  n1 = noise(x, y + EPSILON);
  n2 = noise(x, y - EPSILON);

  //Average to find approximate derivative
  var cy = (n1 - n2)/(2 * EPSILON);
  
  //return new createVector(cx, cy);//gradient toward higher position
  return new createVector(cy, -cx);//rotate 90deg
}

function draw() {
  tint(255, 4);
  image(noiseImg, 0, 0);//fill with transparent noise image
  //fill(0, 4);
  //rect(0, 0, width, height);
  
  strokeWeight(4);//particle size
  stroke(255);
  
  
  for(var i=0; i<particles.length; i++){
    var p = particles[i];//pick a particle
    p.pos.add(curl(p.pos.x/noiseScale, p.pos.y/noiseScale));
    point(p.pos.x, p.pos.y);
  }
}



分隔线

[编辑 | 编辑源代码]

通过数值求解轨迹反向时间,可以清楚地看到分隔线。由于在求解正向时间轨迹时,轨迹会从分隔线发散,而在求解反向时间轨迹时,轨迹会收敛于分隔线。

梯度下降

[编辑 | 编辑源代码]

场线计算

[编辑 | 编辑源代码]

问题陈述

  • 场线追踪(不是曲线素描[11]}
  • 绘制等高线图(在计算机图形学中)= 数值延拓(在数学中)
  • 在均匀网格(光栅扫描或像素)上不分析其结构的情况下,从种子点通过向量场计算积分曲线



场线可用的方法(求解器)[12][13]

  None of these 4 methods generate an exact answer, but they are (from left to right) increasingly more accurate. They also take (from left to right) more and more time to finish as they require more samples for each iteration.
  You won't be able to create reliably closed curves using iterative sampling methods as small errors at any step may be amplified in successive steps. There is also no guarantee that the field-line ends up in the exact coordinate where it started.
  The Grasshopper metaball solver on the other hand uses a marching squares algorithm which is capable of finding closed loops because it is a grid-cell approach and sampling inaccuracy in one area doesn't carry over to another. 
  However the solving of iso-curves is a very different process    from the solving of particle trajectories through fields. ... 
  Typically field lines shoot to infinity rather than form closed loops. That is one reason why I chose the RK methods here, because marching-cubes is very bad at dealing with things that tend to infinity.[16]
场线的构建

给定一个向量场 和一个起点 ,可以通过迭代方式构建场线,方法是找到该点的场向量 。该点的单位切向量 为:。通过沿场方向移动一小段距离 ,可以找到线上一个新的点

然后在那个点的场 被找到,并且在那个方向上移动一个距离 找到了场线的下一个点

通过重复此操作并将这些点连接起来,可以根据需要扩展场线。这只是实际场线的近似值,因为每个直线段实际上并不与其长度上的场相切,而是在其起点处相切。但是,通过使用足够小的值,执行更多更短的步骤,可以根据需要尽可能精确地近似场线。可以从 的相反方向扩展场线,方法是使用负步 在相反方向执行每个步骤。


rk4 数值积分方法

[edit | edit source]

在二维时间无关矢量场的情况下,四阶龙格库塔 (RK4)


是一个矢量函数,对于每个点 p

p = (x, y)

在域中分配一个矢量 v

其中每个函数 是一个标量函数

场线是一条始终与给定矢量场相切的线。

令 r(s) 是由常微分方程组给出的场线,其矢量形式表示为

其中

  • s 表示场线上的弧长,例如连续迭代次数
  • 是一个种子点


2 个变量

[edit | edit source]

给定场线上一个种子点 ,沿场线寻找下一个点 的更新规则(RK4)是[17]

其中

  • h 是沿场线的步长 = ds
  • k 是中间向量

只针对x

[edit | edit source]

这里


给定场线上一个种子点 ,沿场线寻找下一个点 的更新规则(RK4)是[18]



其中

  • h 是沿场线的步长 = dx
  • k 是中间向量

示例

  • [19]

向量场的可视化

[edit | edit source]

绘图类型(流数据可视化技术) : [20]

  • 符号 = 用于可视化向量场的图标或符号
    • 最简单的符号 = 线段(刺猬图)
    • 箭头图 = 羽毛图 = 刺猬(全局箭头图)
  • 特征线 [21]
    • 流线 = 在任何地方都与瞬时向量(速度)场相切的曲线(时间无关向量场)。对于时间无关向量场,轨迹线 = 路径线 = 轨迹线 [22]
  • 纹理 (线积分卷积 = LIC)[23]
  • 拓扑骨架 [24]
    • 不动点提取(雅可比矩阵)
  "path lines, streak lines, and stream lines are identical for stationary flows" Leif Kobbelt[25]



羽毛图

[edit | edit source]

定义

  • "羽毛图显示速度向量为具有分量 (u,v) 的箭头,位于点 (x,y)"[26]

流图

[edit | edit source]

示例场

[编辑 | 编辑源代码]


fBM 代表分形布朗运动

SDF = 有符号距离函数[27]

  • 按维度(1D、2D、3D...)
  • 按颜色
  • 按距离函数(欧几里得距离
  • 算法[28]
    • 高效的快速行进方法,
      • 射线行进[29]
      • 例如行进抛物线,一种线性时间的 CPU 友好算法。
    • 最小腐蚀,一种易于实现的 GPU 友好算法
    • 快速扫描方法
    • 更通用的水平集方法。
  • 可视化(灰色梯度、LSM,
  • 简单的预定义图形或任意形状


它不是


距离函数

单通道颜色

[编辑 | 编辑源代码]

多通道

[编辑 | 编辑源代码]

自适应采样距离字段

[编辑 | 编辑源代码]


字体、字形

[编辑 | 编辑源代码]
// The MIT License
// Copyright © 2020 Inigo Quilez
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// GSLS

// Signed distance to a disk

// List of some other 2D distances: https://www.shadertoy.com/playlist/MXdSRf
//
// and iquilezles.org/articles/distfunctions2d


float sdCircle( in vec2 p, in float r ) 
{
    return length(p)-r;
}


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	vec2 p = (2.0*fragCoord-iResolution.xy)/iResolution.y;
    vec2 m = (2.0*iMouse.xy-iResolution.xy)/iResolution.y;

	float d = sdCircle(p,0.5);
    
	// coloring
    vec3 col = (d>0.0) ? vec3(0.9,0.6,0.3) : vec3(0.65,0.85,1.0); // exterior / interior
    col *= 1.0 - exp(-6.0*abs(d)); // adding a black outline ( gray gradient) to the circle
	col *= 0.8 + 0.2*cos(150.0*d); //  adding waves
	col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,0.01,abs(d)) ); // note: adding white border to the circle

    
	fragColor = vec4(col,1.0);
}

hg_sdf:一个用于构建有符号距离函数的 glsl 库

  • b3dsdf = 一个包含 2D/3D 距离函数、sdf/矢量运算和各种实用着色器节点组(159+)的工具包,适用于 Blender 2.83+

Mandelbrot 集的势

[编辑 | 编辑源代码]

Shadertoy

[编辑 | 编辑源代码]


rboyce1000

[编辑 | 编辑源代码]
  • 由 @rboyce1000 制作的四次多项式向量场的分岔
The coloured curves are the separatrices (i.e. real flow lines reaching infinity) of the complex ODE dz/dt = p(z) = z^4 + O(z^2), where the four roots of p(z) are pictured as the black dots: one fixed at the origin, and the remaining three forming the vertices of an equilateral triangle centered at the origin and rotating.
Bifurcation occurs at certain critical angles of the rotation, where separatrices instantaneously merge to form homoclinic orbits. Following bifurcation, the so-called 'sectorial pairing' is permuted. 
There are a total of 5 possible sectorial pairings for the quartic polynomial vector fields (enumerated by the 3rd Catalan number). 
Three out of the five possibilities can be seen in 2/3 video, while the remaining two can be seen in part 1/3
In 3/3 example, at a bifurcation we have that either: only two of the four roots are centers (the other two remaining attached to separatrices), or NONE of the roots are centers (a phenomenon which does not occur for the quadratic or cubic polynomial vector fields). 
This video is inspired by the work of A. Douady and P. Sentenac. ( rboyce1000)


算法

  • 创建具有所需属性的多项式
    • f(z) = z*g(z) 具有原点的根
    • g(z) 是单位根的 3 次根 =

f(z) = z(z^3 - 1)


可以使用 Maxima CAS 进行检查

 z:x+y*%i;
(%o1)                              %i y + x
(%i2) p:z*(z^3-1);
                                               3
(%o2)                    (%i y + x) ((%i y + x)  - 1)
(%i3) display2d:false;

(%o3) false
(%i4) r:realpart(p);

(%o4) x*((-3*x*y^2)+x^3-1)-y*(3*x^2*y-y^3)
(%i5) m:imagpart(p);

(%o5) x*(3*x^2*y-y^3)+y*((-3*x*y^2)+x^3-1)
(%i6) plotdf([r,m],[x,y]);

(%o6) "/tmp/maxout28945.xmaxima"

(%i8) s:solve([p],[x,y]);

(%o8) [[x = %r1,y = (2*%i*%r1+%i+sqrt(3))/2],
       [x = %r2,y = (2*%i*%r2+%i-sqrt(3))/2],[x = %r3,y = %i*%r3],
       [x = %r4,y = %i*%r4-%i]]



要围绕原点旋转它,请将 1 更改为:不动点的乘子)其中 t 是以转数为单位的真分数


评论中的原始函数

另请参阅

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
  1. 维基百科中的向量场
  2. 维基百科中的欧几里得向量
  3. matlab:梯度函数
  4. stackoverflow 问题:是否有任何标准方法可以计算数值梯度
  5. 由 Mamy Ratsimbazafy 制作的 nnp_numerical_gradient
  6. matrixlab-examples:梯度
  7. 由 itectec 制作的 matlab-function-gradient-numerical-gradient
  8. numDeriv:grad
  9. numpy:梯度
  10. 由 Kenneth I. Joy 制作的向量场中粒子追踪的数值方法
  11. 由 David Guichard 和朋友制作的曲线绘制
  12. liruics:科学可视化入门 - 流场
  13. what-when-how 的光栅算法 - 基本计算机图形学第二部分
  14. bolster.academy : 欧拉方法交互式
  15. Greg Petrics 的交互式龙格库塔 4
  16. grasshopper3d 论坛:场线 - 如何重建并使其周期性?overrideMobileRedirect=1
  17. 三维向量场中临界点的分类和可视化。Furuheim 和 Aasen 的硕士论文
  18. 三维向量场中临界点的分类和可视化。Furuheim 和 Aasen 的硕士论文
  19. Weisstein, Eric W. "积分曲线。" 来自 Wolfram 网络资源 MathWorld
  20. 来自 TUV 的流动可视化
  21. Tomáš Fabián 的数据可视化
  22. 来自 UCF 的拥挤场景中流动的迹线表示
  23. 刘占平的 lic
  24. 流分析和可视化中的向量场拓扑,作者:陈国宁
  25. 向量场可视化,作者:Leif Kobbelt
  26. matlab ref : quiver 图
  27. CedricGuillemet: SDF = 与符号距离场相关的资源(论文、链接、讨论、着色器玩具等)的集合
  28. 2018 年 Philip Rideout 的距离场
  29. ray-march = 通过距离场光线追踪渲染过程 3D 几何图形
华夏公益教科书