

陽に y = f(x) の形で表されている関数のグラフを (x, y) 平面上に描くことを考えます。ただし x_min ≦ x ≦ x_max
の範囲に限定してプロットするとします。

素朴には、x_min から x_max まで少しずつ x を変更しながら (x, f(x)) を計算して、それらの点を線分で繋ぐとグラフが描けそうです。

しかしこの方法だと特異点があるグラフに対して上手く動きません。たとえば反比例のグラフ y = 1 / x は x = 0
において定義されていません。上の素朴なアルゴリズムを Scratch で実装して動かしてみると、y 軸付近に本来は存在しない縦線が引かれてしまいます
(緑の太線がグラフです)。

[![y = 1000 / x のグラフを描こうとした実行結果です。y
軸付近にも縦の線が引かれてしまっています。](https://i.stack.imgur.com/KVBAN.png)](https://i.stack.imgur.com/GnGEX.png)

(以下はこのグラフを描くためのスクリプトです。クリックすると拡大します)

[![y = 1000 / x のグラフを描くための Scratch
のソースコードです。](https://i.stack.imgur.com/kSL2v.png)](https://i.stack.imgur.com/t1JfA.png)

対して [WolframAlpha
にグラフを描かせてみると](https://www.wolframalpha.com/input/?i=y%20%3D%201%20%2F%20x)、上手く特異点付近を除いてプロットしています。

[![WolframAlpha に y = 1 / x
のグラフをプロットさせた結果です](https://i.stack.imgur.com/i52vR.png)](https://i.stack.imgur.com/i52vR.png)

実際 [Wolfram Mathematica の機能](https://www.wolfram.com/language/11/visualization
--labels-scales-exclusions/detect-and-remove-singular-
points.html?product=mathematica)を見ると、特異点を検知して除去している模様です。

また、y = 1 / x 程度であれば手計算で x = 0 が特異点と分かるので手動でそこだけ除去すれば良いのですが、y = tan(x)
など特異点が複数現れると面倒です。

## 質問

関数 f の定義式は入力として与えられるとして、y = f(x)
のグラフをプロットするときに上手く特異点の周りをプロットしないようにするアルゴリズムはありますか？
数値的に解析するものでも、定義式から解析するものでも構いません。必要であれば f の形を制限して構いません。個人的には y = 1 / x や y =
tan(x) 程度が描ければ満足です。ある程度汎用性を持たせたいので、特異点を手計算して除く以外の方法が知りたいです。

※書きやすかったので上では Scratch で書きましたが、アルゴリズムが知りたいだけなので他のプログラミング言語でも疑似コードでも方針だけでも構いません。


CC BY-SA 4.0
2019-01-23T08:34:12.883
52253
2019-03-27T14:23:39.197
2019-01-23T08:43:27.660
19110
19110
question
アルゴリズム
関数のグラフをプロットする際に、特異点の周辺を取り除く方法


描画するときに、１つ前のステップのf(x)の値を持っておき、前ステップとのf(x)の差の絶対値が一定値以上になったら線で結ばないようにしたらどうでしょうか？


CC BY-SA 4.0
2019-03-27T14:23:39.197
53769
2019-03-27T14:23:39.197
30800
52253
answer