ファイル:Cubic graph special points.svg

ページのコンテンツが他言語でサポートされていません。

元のファイル(SVG ファイル、512 × 614 ピクセル、ファイルサイズ: 17キロバイト)

概要

解説
English: Graph showing the relationship between the roots, turning or stationary points and inflection point of a cubic polynomial and its first and second derivatives. The vertical scale is compressed 1:50 relative to the horizontal scale for ease of viewing. Thanks to Álvaro Lozano-Robledo for a method to find a cubic function with distinct special points with non-zero integer coordinates.
原典 投稿者自身による著作物
作者 Cmglee
その他のバージョン
Cubic graph special points repeated.svg
SVG 開発
InfoField
 
このベクター画像のソースコードは 正しくありません。エラーがひとつあります。
 
このW3C-無効 図式Pythonで作成されました。
 
このSVG図式は埋込み文を用いており,容易に翻訳できます。
import re, math
def fmt(string): ## string.format(**vars()) using tags {expression!format} by CMG Lee
 def f(tag): i_sep = tag.rfind('!'); return (re.sub('\.0$', '', str(eval(tag[1:-1])))
  if (i_sep < 0) else ('{:%s}' % tag[i_sep + 1:-1]).format(eval(tag[1:i_sep])))
 return (re.sub(r'(?<!{){[^{}]+}', lambda m:f(m.group()), string)
         .replace('{{', '{').replace('}}', '}'))
def append(obj, string): return obj.append(fmt(string))
def tabbify(cellss, separator='|'):
 cellpadss = [list(rows) + [''] * (len(max(cellss, key=len)) - len(rows)) for rows in cellss]
 fmts = ['%%%ds' % (max([len(str(cell)) for cell in cols])) for cols in zip(*cellpadss)]
 return '\n'.join([separator.join(fmts) % tuple(rows) for rows in cellpadss])

def format_sign(x): return ('%+d' % (x)).replace('+', '+ ').replace('-','&#8722; ')
def scale_x(x): return 50 * x
def scale_y(y): return -y
n_search     = 20
cubic_bez_dx = 15
quad_bez_dx  = 15
linear_dx    = 15
fmt_out = '{id}\
|{root0}|{root1}|{root2}|{max_x}|{max_y}|{min_x}|{min_y}|{inf_x}|{inf_y}|{inf_c}|{inf_m}\
|{cubic_b}|{cubic_c}|{cubic_d}|{quad_b}|{quad_c}\
'
double_dash = '-' * 2
outss = []
outs  = []
for i_pass in range(2): ## 0: to find best values, 1: output SVG
 id_best = None
 if (i_pass == 1):
  outss = sorted(outss, key=lambda outs:[max(abs(int(outs[5])), abs(int(outs[7]))),
                                         max(abs(int(outs[1])), abs(int(outs[3])))])
  id_best = int(outss[0][0])
  print(tabbify([fmt_out.replace('{','').replace('}','').split('|')] + outss))
 id = 0
 for   k2 in range(-n_search, n_search + 1):
  for  k1 in range(k2 + 1, n_search + 1):
   for k0 in range(k1 + 1, n_search + 1):
    (root0, root1, root2) = (-k0, -k1, -k2)
    if (root0 == 0 or root0 == root1 or
        root1 == 0 or root1 == root2 or
        root2 == 0 or root2 == root0): continue
    cubic_a   = 1
    cubic_b   = k0 + k1 + k2
    cubic_c   = k0 * k1 + k1 * k2 + k2 * k0
    cubic_d   = k0 * k1 * k2
    quad_a    = cubic_a * 3
    quad_b    = cubic_b * 2
    quad_c    = cubic_c
    linear_a  = quad_a * 2
    linear_b  = quad_b
    if (cubic_a == 0 or quad_a == 0 or linear_a == 0 or
        cubic_b == 0 or quad_b == 0 or linear_b == 0 or
        cubic_c == 0 or quad_c == 0 or
        cubic_d == 0): continue
    sqrt_disc = (4 * (k0 ** 2 + k1 ** 2 + k2 ** 2 - quad_c)) ** 0.5
    if ((quad_b + sqrt_disc) % linear_a != 0 or
        (quad_b - sqrt_disc) % linear_a != 0): continue
    (max_x, min_x) = [(-quad_b + sign * sqrt_disc) / linear_a for sign in (-1,1)]
    quad_bez_x1  = inf_x = (max_x + min_x) / 2
    linear_x0    = inf_x - linear_dx
    linear_x1    = inf_x + linear_dx
    cubic_bez_x0 = inf_x - cubic_bez_dx
    cubic_bez_x3 = inf_x + cubic_bez_dx
    (inf_y, max_y, min_y, cubic_bez_y0, cubic_bez_y3) = [
                    cubic_a * x ** 3 + cubic_b * x ** 2 + cubic_c * x + cubic_d
                    for x in (inf_x, max_x, min_x, cubic_bez_x0, cubic_bez_x3)]
    quad_bez_x0 = inf_x - quad_bez_dx
    quad_bez_x2 = inf_x + quad_bez_dx
    (inf_m, quad_bez_y0, quad_bez_y2, cubic_bez_m0, cubic_bez_m3) = [
                 quad_a * x ** 2 + quad_b * x + quad_c for x in
                 (inf_x, quad_bez_x0, quad_bez_x2, cubic_bez_x0, cubic_bez_x3)]
    inf_c       = inf_y - inf_m * inf_x
    quad_bez_y1 = ((linear_a * quad_bez_x0 + quad_b) * (quad_bez_x1 - quad_bez_x0) + quad_bez_y0)
    cubic_bez_x1 = (3 * inf_x - cubic_bez_dx) // 3 ## not sure how to get this
    cubic_bez_x2 = inf_x + (inf_x - cubic_bez_x1)
    cubic_bez_y1 = cubic_bez_m0 * (cubic_bez_x1 - cubic_bez_x0) + cubic_bez_y0
    cubic_bez_y2 = cubic_bez_m3 * (cubic_bez_x2 - cubic_bez_x3) + cubic_bez_y3
    if (id == id_best):
     path_cubic = fmt('''M {scale_x(cubic_bez_x0)},{scale_y(cubic_bez_y0)} C\
 {scale_x(cubic_bez_x1)},{scale_y(cubic_bez_y1)}\
 {scale_x(cubic_bez_x2)},{scale_y(cubic_bez_y2)}\
 {scale_x(cubic_bez_x3)},{scale_y(cubic_bez_y3)}''')
     path_quad = fmt('''M {scale_x(quad_bez_x0)},{scale_y(quad_bez_y0)} Q\
 {scale_x(quad_bez_x1)},{scale_y(quad_bez_y1)}\
 {scale_x(quad_bez_x2)},{scale_y(quad_bez_y2)}''')
     path_linear = fmt('''M {scale_x(linear_x0)},{scale_y(linear_x0 * linear_a + linear_b)} L\
 {scale_x(linear_x1)},{scale_y(linear_x1 * linear_a + linear_b)}''')
     path_tangent = fmt('''M {scale_x(float(min_y - inf_c) / inf_m)!.0f},{scale_y(min_y)} L\
 {scale_x(float(max_y - inf_c) / inf_m)!.0f},{scale_y(max_y)}''')
     append(outs,'''\
  <use xlink:href="#axes"/>
  <g stroke-width="4">
   <g mask="url(#mask_line)">
    <path class="line_cubic"   d="{path_cubic}"/>
    <path class="line_quad"    d="{path_quad}"   stroke-dasharray="20,5"/>
    <path class="line_linear"  d="{path_linear}" stroke-dasharray="6,4" stroke-width="6"/>
    <path class="line_tangent" d="{path_tangent}" stroke-dasharray="25,5,5,5,5,5"/>
   </g>
   <g class="line_concav">
    <path d="M {scale_x(max_x)},{scale_y(max_y)} V 0
             M {scale_x(min_x)},{scale_y(min_y)} V 0
             M {scale_x(inf_x)},{scale_y(inf_y)} V 500" stroke-dasharray="20,5,5,5"/>
    <path d="M -630 460 Q -630 470 -620 470 H 35 Q 45 470 45 460 M 55 460 Q 55 470 65 470 H 620 Q 630 470 630 460"/>
   </g>
  </g>
  <g stroke-width="8">
   <g class="label_cubic">
    <text class="equation" x="-70" y="-630"><tspan class="var">f</tspan><tspan dx="0.2ex">(</tspan><tspan class="var">x</tspan><tspan>) =&#160;</tspan><tspan class="var">x</tspan><tspan>&#179; {format_sign(cubic_b)}</tspan><tspan class="var">x</tspan><tspan>&#178; {format_sign(cubic_c)}</tspan><tspan class="var">x</tspan><tspan>&#160;{format_sign(cubic_d)}</tspan></text>
    <g transform="translate({scale_x(root0)},               0)"><use xlink:href="#root"/><text x="0.5ex"  y="2ex">root ({root0})</text></g>
    <g transform="translate({scale_x(root1)},               0)"><use xlink:href="#root"/><text x="0.5ex"  y="2ex">root ({root1})</text></g>
    <g transform="translate({scale_x(root2)},               0)"><use xlink:href="#root"/><text x="-0.5ex" y="2ex" class="end">root ({root2})</text></g>
    <g transform="translate({scale_x(max_x)},{scale_y(max_y)})"><use xlink:href="#tp"  /><text x="-9ex" y="-0.8ex">turning point, stationary point &amp; local maximum ({max_x}, {max_y})</text></g>
    <g transform="translate({scale_x(min_x)},{scale_y(min_y)})"><use xlink:href="#tp"  /><text x="5ex" y="2ex" class="end">turning point, stationary point &amp; local minimum ({min_x}, {min_y})</text></g>
    <g transform="translate({scale_x(inf_x)},{scale_y(inf_y)})"><use xlink:href="#ip"  /><text y="-1ex">falling inflection point ({inf_x}, {inf_y})</text></g>
    <!-{double_dash}
    <g transform="translate(0             ,{scale_y(cubic_d)})"><use xlink:href="#yi"  /><text x="0.5ex">y-intercept ({cubic_d})</text></g>
    {double_dash}>
   </g>
   <g class="label_quad">
    <text class="equation" x="-530" y="-260"><tspan class="var">f</tspan><tspan dx="0.2ex" class="var">'</tspan><tspan dx="0.2ex">(</tspan><tspan class="var">x</tspan><tspan>) = {quad_a}</tspan><tspan class="var">x</tspan><tspan>&#178; {format_sign(quad_b)}</tspan><tspan class="var">x</tspan><tspan>&#160;{format_sign(quad_c)}</tspan></text>
    <g transform="translate({scale_x(max_x)},               0)"><use xlink:href="#root"/><text x="0.5ex"  y="-0.2ex">root ({max_x})</text></g>
    <g transform="translate({scale_x(min_x)},               0)"><use xlink:href="#root"/><text x="-0.3ex" y="-0.2ex" class="end">root ({min_x})</text></g>
    <g transform="translate({scale_x(inf_x)},{scale_y(inf_m)})"><use xlink:href="#tp"  /><text x="-1ex" y="2ex" class="end"><tspan>turning point, stationary point</tspan><tspan x="-1ex" dy="2ex">&amp; local maximum ({inf_x}, {inf_m})</tspan></text></g>
    <use xlink:href="#tp"   transform="translate({scale_x(inf_x)},{scale_y(inf_m)})"/>
   </g>
   <g class="label_linear">
    <text class="equation" x="-560" y="120"><tspan class="var">f</tspan><tspan dx="0.2ex" class="var">''</tspan><tspan dx="0.2ex">(</tspan><tspan class="var">x</tspan><tspan>) = {linear_a}</tspan><tspan class="var">x</tspan><tspan>&#160;{format_sign(linear_b)}</tspan></text>
    <g transform="translate({scale_x(inf_x)},               0)"><use xlink:href="#root"/><text x="-0.5ex" y="-0.2ex" class="end">root ({inf_x})</text></g>
   </g>
   <g class="label_concav">
    <text x="-295" y="505"><tspan class="var">f</tspan><tspan dx="0.2ex">(</tspan><tspan class="var">x</tspan><tspan>) curve concave (downwards)</tspan></text>
    <text x="345"  y="505"><tspan class="var">f</tspan><tspan dx="0.2ex">(</tspan><tspan class="var">x</tspan><tspan>) convex (downwards)</tspan></text>
   </g>
   <g class="label_tangent">
    <g transform="translate(-140,-860)"><text><tspan>tangent at inflection point:</tspan><tspan x="15" dy="2ex" class="var">y</tspan><tspan>&#160;= -147</tspan><tspan class="var">x</tspan><tspan>&#160;+ 433</tspan></text></g>
   </g>
  </g>
''')
    outss.append(fmt(fmt_out).split('|'))
    id += 1

out_p = fmt('width="100%" height="100%" viewBox="-640 -1024 1280 1536"')

## Compile everything into an .svg file
myself   = open(__file__, 'r').read() ## the contents of this very file
file_out = open(__file__[:__file__.rfind('.')] + '.svg', 'w') ## *.* -> *.svg
try: ## use try/finally so that file is closed even if write fails
 file_out.write('''<?xml version="1.0" encoding="utf-8"?><!%s
%s%s%s\n%s%s''' % ('-' + '-', ## because SVG comments cannot have 2 consecutive '-'s
  myself[ : myself.find('width',myself.find('<svg'))], ## assume width specified before height/viewBox
  out_p, ## replace SVG width/height/viewBox with {out_p} & dynamic SVG block with {outs} contents
  myself[myself.find('>',myself.find('<svg')) : myself.find('\n',myself.find('BEGIN_'+'DYNAMIC_SVG'))],
  '\n'.join(outs), myself[myself.rfind('\n',0,myself.find('END_'+'DYNAMIC_SVG')) : ]))
finally:
 file_out.close()

## SVG-Python near-polyglot framework version 2 by CMG Lee (Feb 2016) -->

ライセンス

この作品の著作権者である私は、この作品を以下のライセンスで提供します。
w:ja:クリエイティブ・コモンズ
表示 継承
このファイルはクリエイティブ・コモンズ 表示-継承 3.0 非移植ライセンスのもとに利用を許諾されています。
あなたは以下の条件に従う場合に限り、自由に
  • 共有 – 本作品を複製、頒布、展示、実演できます。
  • 再構成 – 二次的著作物を作成できます。
あなたの従うべき条件は以下の通りです。
  • 表示 – あなたは適切なクレジットを表示し、ライセンスへのリンクを提供し、変更があったらその旨を示さなければなりません。これらは合理的であればどのような方法で行っても構いませんが、許諾者があなたやあなたの利用行為を支持していると示唆するような方法は除きます。
  • 継承 – もしあなたがこの作品をリミックスしたり、改変したり、加工した場合には、あなたはあなたの貢献部分を元の作品とこれと同一または互換性があるライセンスの下に頒布しなければなりません。
GNU head この文書は、フリーソフトウェア財団発行のGNUフリー文書利用許諾書 (GNU Free Documentation License) 1.2またはそれ以降のバージョンの規約に基づき、複製や再配布、改変が許可されます。不可変更部分、表紙、背表紙はありません。このライセンスの複製は、GNUフリー文書利用許諾書という章に含まれています。
あなたは上記のライセンスから、どれか一つ以上を選択できます。

キャプション

このファイルの内容を1行で記述してください

このファイルに描写されている項目

題材

a61221eeba1b4683b672c939f4d93ab756a85a65

17,862 バイト

614 ピクセル

512 ピクセル

ファイルの履歴

過去の版のファイルを表示するには、その版の日時をクリックしてください。

(最新 | 最古) (以後の10件 | ) (10 | 20 | 50 | 100 | 250 | 500 件) を表示
日付と時刻サムネイル寸法利用者コメント
現在の版2024年2月4日 (日) 01:082024年2月4日 (日) 01:08時点における版のサムネイル512 × 614 (17キロバイト)CmgleeWork around leading-or-trailing-nonbreaking-space-ignored rsvg bug: http://en.wikipedia.org/w/index.php?title=Wikipedia:SVG_help&diff=prev&oldid=1189400853
2024年2月4日 (日) 00:592024年2月4日 (日) 00:59時点における版のサムネイル512 × 614 (17キロバイト)CmgleeFix "global minimum" and use minus signs
2024年2月2日 (金) 06:352024年2月2日 (金) 06:35時点における版のサムネイル512 × 614 (17キロバイト)Opencooperrv: not sure if it's something I changed or changes in the renderer, but the new MediaWiki raster conversion doesn't preserve the non-breaking spaces and uses a spindly font
2024年2月2日 (金) 06:282024年2月2日 (金) 06:28時点における版のサムネイル512 × 614 (17キロバイト)Opencooperproper Unicode minus sign
2019年4月19日 (金) 18:182019年4月19日 (金) 18:18時点における版のサムネイル512 × 614 (17キロバイト)CmgleeUse exact cubic and quadratic Bézier curves instead of approximating with polylines, update labels, shrink markers and convert to near-polyglot Python.
2013年8月26日 (月) 09:442013年8月26日 (月) 09:44時点における版のサムネイル512 × 614 (19キロバイト)AnonMoosremove trivial syntax error, should now validate
2012年8月3日 (金) 19:302012年8月3日 (金) 19:30時点における版のサムネイル512 × 614 (19キロバイト)CmgleeAdd tangent at inflection point.
2012年8月3日 (金) 12:492012年8月3日 (金) 12:49時点における版のサムネイル512 × 614 (17キロバイト)CmgleeFix based on comments by Duoduoduo and 188.127.120.236.
2012年3月27日 (火) 21:182012年3月27日 (火) 21:18時点における版のサムネイル512 × 614 (17キロバイト)CmgleeAlign text labels.
2012年3月25日 (日) 20:592012年3月25日 (日) 20:59時点における版のサムネイル512 × 614 (17キロバイト)CmgleeRefine text labels.
(最新 | 最古) (以後の10件 | ) (10 | 20 | 50 | 100 | 250 | 500 件) を表示

以下のページがこのファイルを使用しています:

グローバルなファイル使用状況

以下に挙げる他のウィキがこの画像を使っています:

メタデータ