(적응?) 함수 플로팅 알고리즘


21

특이점을 갖거나 갖지 않는 함수에 대한 표준 2D 그래프를 그리는 알고리즘을 찾고 있습니다. 목적은 "Mini-CAS"를 작성하는 것이므로 사용자가 그래프로 표시하려는 함수 유형에 대한 사전 지식이 없습니다.

이 문제는 매우 오래되었으므로 문헌에 표준 알고리즘이 있어야한다고 생각합니다. 한 번은 Google을 통해 참조를 찾는 데 성공하지 못했습니다.

흥미로운 알고리즘, 즉 "Adaptive function plotting"이라는 " YACAS-Book of algorithms"에서이 알고리즘을 찾았습니다 .

간단히 말해 :

  • 표준 알고리즘이 있습니까?
  • 알려진 플롯하기 어려운 기능을위한 테스트 스위트가 있습니까?
  • 읽을만한 흥미로운 논문은 무엇입니까?

2
아마도 "그래프 그리기"대신 "함수 플로팅"으로 문제를 더 잘 이해할 수 있을까요? 처음에 제목을 잘못 해석했습니다 (그래프 이론).
astrojuanlu

@ Juanlu001 제안 해 주셔서 감사합니다. 제목을 변경했습니다.
soegaard

2D를 말할 때 와 같은 1 변수 함수를 플로팅하는 것을 의미합니까 , 아니면 2D로 표시된 2 변수 함수 ( f ( x , y ) )에 관심이 있습니까? 다른 가치? f(x)f(x,y)
Szabolcs

글쎄, 나는 하나의 변수의 함수를 플로팅하는 것을 의미했다. 그러나 두 변수 설정에서 평가할 포인트를 선택하는 알고리즘에 대해서도 듣고 싶습니다. 나는 색과 음영에 대해 듣고 싶지 않습니다.
soegaard

2D 기능에 대해서는 내 질문 및 답변을 참조 하십시오 . 내가 한 일은 꽤 제한적이며 임의의 기능에는 잘 작동하지 않습니다. 또한 방법이 제대로 수렴하지 않는 설명에서 누락 된 몇 가지 필수 단계가 있습니다. 메쉬의 각 가장자리 중간에 새로운 샘플링 포인트를 삽입해야 다음 재 삼각 측량에서 사라집니다. (계속)
Szabolcs

답변:


10

나는 여기서 GitHub에서 Mathematica의 적응 샘플링 루틴을 구현했습니다 (이것은 단일 C 파일이며 헤더 파일의 소스 트리로 이동합니다). 오래 전에 Mathematica에 대한 큰 책에서 루틴에 대한 설명을 찾았으며 지금은이 구현에 변형을 사용하고 있습니다. 기본적으로 관심 영역에 대해 대략적인 선형 샘플을 수행 한 다음 높은 곡률 영역을 개선하기 위해 되돌아갑니다. 매우 날카로운 일부 기능이 누락되었을 수 있지만 실제로는 매우 드문 경우입니다. 이 파일에는 병렬 버전도 포함되어 있습니다.


1
어떤 책입니까? 내가 연결 한 것입니까? 버전 5와 6 사이에서 구현에서 정확히 어떤 변화가 있는지 알고 있습니까?
Szabolcs가

1
@Szabolcs : 아니요, 이 책 섹션 4.1.3 에 있다고 생각합니다 . 이 설명은 이전 버전의 Mathematica에 적용됩니다. 최신 버전 (v6부터 시작될 수 있음)은 수직 점근선을 감지하고 플롯에서 가짜 수직선을 제거합니다. 새로운 버전은 불연속성, 정의되지 않은 영역 및 분기 컷을 처리하기 위해 많은 정교한 기호 사전 처리를 수행합니다.
Victor Liu

당신이 이야기하고있는 상징적 인 전처리를 문서에서 "제외 감지"라고합니다. 로 정의 Exclusions -> None하여 함수 구조를 숨기거나 숨길 수 있습니다 . 이것은 내가 변경에 대해 물었을 때 내가 말한 것이 아닙니다. v5와 v6이 다른 지점에서 샘플링 되었기 때문에 알고리즘에 일부 변경 사항이 있다고 생각합니다. 지금은 다시 비교하기 위해 v5에서 테스트 할 수 없습니다. Plotf[x_?NumericQ] := ...
Szabolcs가

"Mathematica 그래픽 가이드 북"에는이 문제에 대한 아주 좋은 토론이 포함되어 있습니다. 특히 알고리즘의 단점도 설명했습니다.
soegaard 2016 년

더 이상 GitHub 파일을 찾을 수 없습니다. 이동 했습니까?
Andrei

12

다른 CAS가이를 수행하는 방법을 알고 있으면 도움이 될 수 있습니다.

f(x)(x(t),y(t))f(x)

  1. 플로팅 도메인에서 규칙적으로 간격을 둔 점 그리드로 시작하십시오. (Mathematica에는을 (를) 호출하는 횟수를 제어하는 ​​매개 변수가 있습니다 PlotPoints.)

  2. (x1,f(x1)),(x2,f(x2)),(x3,f(x3))x1+x22x2+x32

  3. 반복 한계에 아직 도달하지 않은 경우 ( MaxRecursionMathematica에서 설정 ) 2 단계부터 반복하십시오.

이 중 일부는 Stan Wagon의 Mathematica in Action 책에서 논의되며 여기에서 Google 도서에서 볼 수 있습니다 .

함수 계산에 많은 비용이 계산되는 횟수를 더 잘 제어하기 위해이 알고리즘을 구현했습니다. 2 단계를위한 Mathematica 코드는 다음과 같습니다.

nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}

subdivide1d[result_, resolution_, maxAngle_: 10] :=
  Module[
    {deriv, angle, dangle, pos, nf},
    deriv = nd[result\[Transpose]];
    angle = ArcTan[#2] & @@@ deriv;
    dangle = Differences[angle];
    pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
    pos = Union[pos, pos + 1];
    nf = Nearest[result[[All, 1]]];
    Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
  ]

7

함수 그래프의 MathWorld 웹 페이지 에는 적응 함수 플로팅과 관련이있는 것으로 보이는 여러 논문에 대한 참조가 포함되어 있습니다. 페이지 인용 :

그래프를 작성하는 좋은 방법은 함수가 가장 빠르게 변하는 지역에서 더 많은 점을 나타내는 적응 형 알고리즘을 사용합니다 (Wagon 1991, Math Works 1992, Heck 1993, Wickham-Jones 1994). Tupper (1996)는 알고리즘을 개발했다 ...]

반면에 구글에서 나는 종이를 우연히 발견했다.

www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf

그것은 도메인과 다른 것들을 올바르게 선택하는 방법을 설명합니다. 나는 그들이 당신에게 도움이되기를 바랍니다.


1

나는이 주제를 발견하고 이것을 Julia 라이브러리 Plots.jl에 추가하기 위해 개발자 문제 페이지 를 공유해야한다고 생각 했습니다. 우리는 Mathematica의 구현에 대한 노트에서 시작하여 좋은 결과를 얻을 수있는 것을보기 위해 많은 기술을 시도했습니다. 잘라 내기, 간격 끝점에서 정확하게 시작되지 않는 작은 섭동, 재귀 한계 및 이중 메쉬 오류 추정기가 "정확하게"얻기 위해 모두 필요했습니다. 스레드는 또한 구현을위한 오픈 소스 코드를 가리 킵니다. 따라서 약간의 조정이 필요했지만 이러한 기능을 추가하면 스레드에 표시된 것처럼 테스트에 따라 상당히 강력 해졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.