Как построить трехмерный график с помощью Racket

#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. вы абсолютно правы. И как мне это сделать? Как мне построить эту поверхность?