#plot #graph #3d #lisp #racket
#построение #График #3D #lisp #racket
Вопрос:
Я использую Racket и Dr. Racket. Существует отличная библиотека под названием plot, которая позволяет вам строить графики в 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:
Комментарии:
1. Если вы прочитаете документацию surface3d , вы увидите, что функциональный параметр имеет два параметра, а не три.
2.
f (x,y,z) = 2(x-2)^2 (y-1)^2 (z-3)^2 - 10
это не уравнение, это (определение) функция трех параметров. Уравнение, которое вы ищете, это2(x-2)^2 (y-1)^2 (z-3)^2 = 10
(то естьf(x,y,z) = 0
), которое вы ввели в Wolfram. Решите его для одной из переменных.
Ответ №1:
Независимо от деталей реализации Racket, то, что вы пытаетесь сделать, не имеет смысла. Вы пытаетесь построить функцию, которая отображает от R ^ 3 до R, и вы не можете сделать это в виде графика поверхности в 3 измерениях: вам нужно 4.
Итак, поскольку существует ответ на эту проблему, он заключается в переосмыслении того, что вы пытаетесь сделать. Одним из подходов было бы изменить вашу функцию, чтобы вы могли построить ее для фиксированных значений одного из ее аргументов: (plot3d (surface3d (curryr (lambda (x y z) ...) 3.0) ...))
построим ее, например, для z = 3.0.
Комментарии:
1. На самом деле, я попробовал это в Wolfram Alpha, и это сработало. Я обновлю свой пост.
2. @fallowzito Что сделала alpha, так это построила поверхность, где эта функция равна нулю. Это совсем не то же самое, что построение функции.
3. вы абсолютно правы. И как мне это сделать? Как мне построить эту поверхность?