我正在使用Racket和Dr. Racket。有一个很棒的图书馆叫做情节,可以让你用2D或3D绘制图形。
导入包后:
(require plot)
我可以将f(x,y) = 3 * x
之类的图表绘制成:
(plot3d (surface3d (lambda (x y) (* x 3)) (- 10) 10 (- 10) 10))
然而,当我尝试绘制这个等式时:
f (x,y,z) = 2(x-2)^2 + (y-1)^2+(z-3)^2 - 10
(plot3d (surface3d (lambda (x y z) (+ (* 2 (expt (- x 2) 2))
(expt (- y 1) 2)
(expt (- z 3) 2)
-10))
(- 10) 10 (- 10) 10))
我收到一条错误消息,我无法理解:
surface3d: contract violation
expected: a procedure that accepts 2 non-keyword argument
given: #<procedure:...top/graficos.rkt:14:19>
in: the 1st argument of
(->*
((-> any/c any/c Real))
((or/c Real #f)
(or/c Real #f)
(or/c Real #f)
(or/c Real #f)
#:alpha
Nonnegative-Real
#:color
(or/c
Integer
Symbol
String
(recursive-contract g147 #:impersonator)
(cons/c
Real
(cons/c Real (cons/c Real '()))))
#:label
(or/c #f String)
#:line-color
(or/c
Integer
Symbol
String
(recursive-contract g147 #:impersonator)
(cons/c
Real
(cons/c Real (cons/c Real '()))))
#:line-style
(or/c
Integer
'transparent
'solid
'dot
'long-dash
'short-dash
'dot-dash)
#:line-width
Nonnegative-Real
#:samples
Positive-Integer
#:style
(or/c
Integer
'transparent
'solid
'bdiagonal-hatch
'crossdiag-hatch
'fdiagonal-hatch
'cross-hatch
'horizontal-hatch
'vertical-hatch)
#:z-max
(or/c Real #f)
#:z-min
(or/c Real #f))
any)
contract from:
<pkgs>/plot-lib/plot/private/plot3d/surface.rkt
blaming: /home/pedro/Desktop/graficos.rkt
(assuming the contract is correct)
at: <pkgs>/plot-lib/plot/private/plot3d/surface.rkt:49.9
绝对有可能对此进行图表化。我是在Wolfram Alpha上做到的:
答案 0 :(得分:2)
无论Racket实现的细节如何,您尝试做的事情都没有意义。您正在尝试绘制一个从R ^ 3映射到R的函数,并且您不能将其作为3维表面图:您需要4。
所以,就这个问题的答案而言,重新思考你想要做的事情。一种方法是调整你的函数,这样你就可以将它绘制成一个参数的固定值:(plot3d (surface3d (curryr (lambda (x y z) ...) 3.0) ...))
将为z = 3.0绘制它。