Các thuật toán cho âm mưu (thích ứng?)


21

Tôi đang tìm kiếm các thuật toán để vẽ đồ thị 2d tiêu chuẩn cho các hàm có thể có hoặc không có điểm kỳ dị. Mục đích là để viết một "Mini-CAS", vì vậy tôi không có kiến ​​thức chuyên môn về các loại chức năng, người dùng muốn vẽ biểu đồ.

Vấn đề này rất cũ, vì vậy tôi tưởng tượng phải có một số thuật toán tiêu chuẩn trong tài liệu. Lần đầu tiên tôi không có nhiều thành công trong việc tìm kiếm tài liệu tham khảo qua Google.

Tôi đã tìm thấy một thuật toán thú vị, cụ thể là thuật toán này từ "YACAS - Sách thuật toán" có tên " Vẽ đồ thị hàm thích ứng".

Vì vậy, trong ngắn hạn:

  • Có các thuật toán tiêu chuẩn?
  • Có một bộ kiểm tra cho các chức năng khó biết cốt truyện?
  • Các giấy tờ thú vị để đọc là gì?

2
Có lẽ câu hỏi sẽ được hiểu rõ hơn với "vẽ đồ thị" thay vì "vẽ biểu đồ"? Tôi đã hiểu sai tiêu đề lúc đầu (lý thuyết đồ thị).
astrojuanlu

@ Juanlu001 Cảm ơn bạn đã gợi ý. Tôi đã thay đổi tiêu đề.
soegaard

Khi bạn nói 2D, bạn có nghĩa là vẽ một hàm một biến như hoặc bạn cũng quan tâm đến hàm hai biến ( ) được hiển thị trong 2D với các màu / sắc thái khác nhau đại diện các giá trị khác nhau? f ( x , y )f(x)f(x,y)
Szabolcs

Vâng, tôi có nghĩa là vẽ một chức năng của một biến. Tuy nhiên, tôi cũng muốn nghe về các thuật toán để chọn điểm nào để đánh giá trong cài đặt hai biến. Tôi không quan tâm đến việc nghe về màu sắc và bóng.
soegaard

Đối với các chức năng 2D, xem câu hỏi và câu trả lời của tôi ở đây . Những gì tôi đã làm ở đó khá hạn chế và sẽ không hoạt động tốt với chức năng tùy ý. Ngoài ra, có một số bước cần thiết bị thiếu trong phần mô tả mà không có phương thức nào không hội tụ đúng: Tôi cần chèn một điểm lấy mẫu mới ở giữa mỗi cạnh của lưới sẽ biến mất trong lần lấy lại tiếp theo. (tiếp).
Szabolcs

Câu trả lời:


10

Tôi đã triển khai thói quen lấy mẫu thích ứng của Mathicala ở đây trên GitHub (Đó là một tệp C duy nhất, đi đến cây nguồn cho tệp tiêu đề). Tôi đã tìm thấy một mô tả về thói quen trong một cuốn sách lớn về Mathicala từ lâu và bây giờ tôi đã sử dụng các biến thể của việc triển khai này. Về cơ bản, nó thực hiện một mẫu tuyến tính thô trên miền quan tâm, sau đó quay lại để tinh chỉnh các vùng có độ cong cao. Có thể một số tính năng rất sắc nét bị bỏ qua, nhưng trong thực tế tôi thấy điều này cực kỳ hiếm. Tập tin này cũng chứa phiên bản song song.


1
Đó là cuốn sách nào? Có phải đó là một trong những tôi liên kết? Bạn có biết chính xác những thay đổi trong việc thực hiện giữa các phiên bản 5 và 6 không?
Szabolcs

1
@Szabolcs: Không, tôi tin rằng nó nằm trong phần sách này 4.1.3. Mô tả áp dụng một phiên bản Mathicala rất cũ. Các phiên bản mới hơn (có thể bắt đầu từ v6) phát hiện các tiệm cận đứng và loại bỏ các đường thẳng đứng giả khỏi các ô. Các phiên bản mới chắc chắn thực hiện nhiều quá trình tiền xử lý tượng trưng tinh vi để đối phó với sự không liên tục, các vùng không xác định và cắt giảm chi nhánh.
Victor Liu

Tiền xử lý tượng trưng mà bạn đang nói đến được gọi là "phát hiện loại trừ" trong tài liệu. Nó có thể được tắt bằng cách Exclusions -> Nonehoặc bằng cách ẩn cấu trúc của hàm của bạn khỏi Plotbằng cách định nghĩa nó là f[x_?NumericQ] := .... Đây không phải là những gì tôi đã đề cập khi tôi hỏi về những thay đổi. Tôi tin rằng có một số thay đổi đối với thuật toán, vì v5 và v6 được lấy mẫu ở các điểm khác nhau. Ngay bây giờ tôi không thể kiểm tra trên v5 mặc dù để so sánh lại.
Szabolcs

"Sách hướng dẫn đồ họa Mathicala" chứa một cuộc thảo luận rất tốt về vấn đề này. Tôi đặc biệt thích rằng các comings ngắn của thuật toán cũng được mô tả.
soegaard

Tôi không thể tìm thấy tệp GitHub nữa, nó đã di chuyển chưa?
Andrei

12

Biết làm thế nào CAS khác làm điều này có thể giúp bạn.

f(x)(x(t),y(t))f(x)

  1. Bắt đầu với một lưới các điểm cách đều đặn trên miền vẽ. Trong Mathicala, có một tham số để kiểm soát số lượng cần lấy, được gọi PlotPoints.)

  2. (x1,f(x1)),(x2,f(x2)),(x3,f(x3))x1+x22x2+x32

  3. Nếu chúng ta chưa đạt đến giới hạn lặp lại (được đặt MaxRecursiontrong Mathicala), hãy lặp lại từ bước 2.

Một số điều này được thảo luận trong cuốn sách Mathicala in Action của Stan Wagon, mà bạn có thể thấy ở đây trên Google Books .

Tôi đã thực hiện thuật toán này trước đây để kiểm soát tốt hơn số lần tính toán chi phí đắt đỏ của tôi. Đây là mã Mathicala cho bước 2:

nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}

subdivide1d[result_, resolution_, maxAngle_: 10] :=
  Module[
    {deriv, angle, dangle, pos, nf},
    deriv = nd[result\[Transpose]];
    angle = ArcTan[#2] & @@@ deriv;
    dangle = Differences[angle];
    pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
    pos = Union[pos, pos + 1];
    nf = Nearest[result[[All, 1]]];
    Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
  ]

7

Trang web MathWorld trên Đồ thị chức năng chứa các tham chiếu đến một số bài báo dường như có liên quan đến âm mưu chức năng thích ứng. Trích dẫn trang:

Các thói quen tốt để vẽ đồ thị sử dụng các thuật toán thích ứng, vẽ đồ thị nhiều điểm hơn ở các khu vực có chức năng thay đổi nhanh nhất (Wagon 1991, Math Works 1992, Heck 1993, Wickham-Jones 1994). Tupper (1996) đã phát triển một thuật toán [...]

Mặt khác, trên Google, tôi tình cờ thấy một tờ giấy

www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf

Điều đó giải thích làm thế nào để chọn đúng tên miền và những thứ khác. Tôi hy vọng chúng hữu ích cho bạn.


1

Tôi tìm thấy chủ đề này và nghĩ rằng tôi nên chia sẻ trang vấn đề dành cho nhà phát triển để thêm chủ đề này vào thư viện Julia Plots.jl. Chúng tôi đã thử một loạt các kỹ thuật để xem những gì sẽ cho kết quả tốt, bắt đầu từ các ghi chú về việc triển khai Mathicala. Thêm một số cắt tỉa, một nhiễu loạn nhỏ để không bắt đầu chính xác tại các điểm cuối khoảng, giới hạn đệ quy và một công cụ ước tính lỗi lưới kép là tất cả cần thiết để "làm cho đúng". Chuỗi này cũng chỉ cho bạn mã nguồn mở để thực hiện. Vì vậy, nó đã mất một chút tinh chỉnh, nhưng việc thêm các tính năng đó làm cho nó khá mạnh mẽ (theo các thử nghiệm, như thể hiện trong luồng).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.