Khi bắt đầu học kỳ, tôi khuyên bạn nên sử dụng ứng dụng Anaconda Navigator để thiết lập môi trường sử dụng trong khóa học này. Trong vài tuần tới, tôi sẽ giới thiệu cho bạn một số gói Python. trong nhiều trường hợp, chúng tôi sẽ cần bắt đầu bằng cách thêm một số gói bổ sung vào môi trường của bạn
Trong bài giảng hôm nay chúng ta sẽ làm việc với matplotlib, đây là một gói phần mềm để xây dựng các biểu đồ. Để sử dụng matplotlib, bạn sẽ cần thêm nó vào môi trường của mình
Khởi động ứng dụng Anaconda Navigator và nhấp vào tab môi trường ở bên trái màn hình chính. Chọn môi trường CMSC210 từ danh sách các môi trường có sẵn. Trong khung bên phải, chọn Not Installed từ menu rồi nhập
import matplotlib.pyplot as plt0 vào hộp tìm kiếm
Nhấp vào hộp kiểm bên cạnh
import matplotlib.pyplot as plt0 trong danh sách kết quả, sau đó nhấp vào áp dụng
Tiếp theo, để có thể hiển thị các ô trong Visual Studio Code, bạn sẽ cần cài đặt gói thứ hai. Làm theo quy trình được nêu ở trên để cài đặt gói jupyter
giới thiệu pyplot
Một mô-đun trong thư viện matplotlib là pyplot, trình bày một giao diện đơn giản và dễ sử dụng để xây dựng các biểu đồ
Đối với ví dụ pyplot đầu tiên của chúng tôi, tôi sẽ xây dựng trên ví dụ hồi quy tuyến tính từ một trong những bài giảng trước đây của chúng tôi. Lần này, tôi muốn tính toán đường hồi quy và sau đó sử dụng pyplot để vẽ cả điểm dữ liệu thô và đường hồi quy
Đây là mã nguồn hoàn chỉnh cho ví dụ đó. Dưới đây tôi sẽ chia nhỏ vấn đề này và đề cập đến một số khía cạnh cụ thể của việc sử dụng pyplot
import matplotlib.pyplot as plt def cleanLine[line]: """Converts a raw line list into an appropriate data format.""" return [int[line[0]], float[line[1]]] def readData[fileName]: """Generic data reading function. Uses cleanLine to format lines of data.""" data = [] with open[fileName] as f: for line in f.readlines[]: data.append[cleanLine[line.split[]]] return data def means[pairs]: xSum = 0 ySum = 0 for x,y in pairs: xSum += x ySum += y N = len[pairs] return [xSum/N,ySum/N] def covariance[pairs,means]: sum = 0 for x,y in pairs: sum += [x-means[0]]*[y-means[1]] return sum def xVariance[pairs,xMean]: sum = 0 for x,y in pairs: sum += [x-xMean]*[x-xMean] return sum def regressionCoeffs[pairs]: """Computes linear regression coefficients [a,b] from a list of [x,y] pairs.""" m = means[pairs] beta = covariance[pairs,m]/xVariance[pairs,m[0]] alpha = m[1]-beta*m[0] return [alpha,beta] rawData = readData["farm.txt"] pairs = [cleanLine[line] for line in rawData] a,b = regressionCoeffs[pairs] # pyplot expects the data to be plotted to be in the form # of a list of x values and a list of y values. # Reconfigure the data to suit pyplot. x = [year for year,pop in rawData] y = [pop for year,pop in rawData] s = [1930,1990] t = [a+b*1930,a+b*1990] # Now plot the data sequence and the regression line plt.plot[x,y,'rs',s,t,'b-'] # Set the axis details plt.axis[[1930,1990,0,35]] # Add title and labels plt.title["Regression Example"] plt.xlabel["Year"] plt.ylabel["Farm Population [in millions]"] plt.show[]
Để chạy chương trình này trong Visual Studio Code, nhấp chuột phải vào tệp trong chế độ xem tệp và chọn tùy chọn "Chạy tệp trong cửa sổ tương tác mới"
Khái niệm cơ bản về pyplot
Để sử dụng pyplot, chúng tôi bắt đầu với một câu lệnh nhập
import matplotlib.pyplot as plt
matplotlib là một phần của bản phân phối Anaconda, vì vậy bạn nên cài đặt matplotlib
Lưu ý quan trọng. Người dùng Mac có thể cần thay thế câu lệnh nhập này bằng câu lệnh thay thế được hiển thị bên dưới
import matplotlib matplotlib.use['TkAgg'] import matplotlib.pyplot as plt
Phương thức đầu tiên và quan trọng nhất trong pyplot là phương thức
import matplotlib.pyplot as plt2, phương thức này vẽ một tập hợp các điểm dữ liệu.
import matplotlib.pyplot as plt2 dự kiến các điểm dữ liệu sẽ được cung cấp dưới dạng danh sách giá trị x và danh sách giá trị y riêng biệt. Nếu dữ liệu của bạn không được sắp xếp theo cách đó, bạn sẽ phải viết một đoạn mã nhỏ để sắp xếp lại nó. Trong ví dụ này, dữ liệu mà chúng tôi đọc từ tệp được lưu trữ dưới dạng danh sách các bộ [x,y], vì vậy chúng tôi phải bắt đầu với một số mã để tạo danh sách x và y riêng biệt từ dữ liệu đó
x = [year for year,pop in rawData] y = [pop for year,pop in rawData]
Để vẽ đường hồi quy, chúng ta chỉ cần xây dựng một chuỗi dữ liệu bao gồm một vài điểm, các điểm cuối của đường mà chúng ta muốn vẽ
________số 8Lệnh
import matplotlib.pyplot as plt2 có thể vẽ một hoặc nhiều chuỗi dữ liệu. Sau mỗi chuỗi, chúng tôi cũng cần cung cấp một chuỗi định dạng để chỉ định cách chúng tôi muốn chuỗi được vẽ
import matplotlib.pyplot as plt0
Chuỗi định dạng bao gồm hai ký tự, một màu và một kiểu vẽ. Dưới đây là bảng các giá trị màu có sẵn và mã chữ cái của chúng
mã màumàu xanh da trờibmàu xanh lá câygredrcyancmagentammàu vàngyblackkwhitewDưới đây là bảng một số kiểu cốt truyện có sẵn
Ví dụ biểu đồ mà chúng tôi đã sử dụng ở trên sẽ vẽ chuỗi dữ liệu bằng các ô vuông màu đỏ và đường hồi quy là một đường màu xanh lam
Sau khi thiết lập cốt truyện, bạn thường sẽ muốn thiết lập các trục và gắn nhãn cho chúng. Các lệnh này làm điều đó
import matplotlib.pyplot as plt1
Phương thức
import matplotlib.pyplot as plt5 lấy một danh sách cung cấp giá trị đầu và cuối cho trục x theo sau là giá trị đầu và cuối cho trục y
Bước cuối cùng trong việc vẽ sơ đồ là yêu cầu pyplot hiển thị cốt truyện
import matplotlib.pyplot as plt3
Thao tác này sẽ mở một cửa sổ đồ họa hiển thị cốt truyện. Cửa sổ đồ họa cung cấp các điều khiển cho phép bạn chỉnh sửa hoặc lưu hình ảnh. Đây là cốt truyện được tạo bởi chương trình ví dụ này
Bạn cũng có thể yêu cầu pyplot lưu cốt truyện trong tệp hình ảnh
import matplotlib.pyplot as plt4
Điều này sẽ lưu tệp hình ảnh trong cùng thư mục với tệp mã nguồn của chương trình Python
Vẽ một đường cong mượt mà
Trong ví dụ tiếp theo, chúng ta sẽ vẽ một đường cong mượt mà của hàm logistic
Đây là cốt truyện mà pyplot sẽ tạo ra cho chúng ta
Đây là mã cho chương trình tạo ra âm mưu này
import matplotlib.pyplot as plt5
Cách tiếp cận cơ bản ở đây giống như trong ví dụ trước. Chúng tôi bắt đầu bằng cách lập danh sách các mẫu dọc theo trục x. Sau đó, khi xây dựng một danh sách thứ hai chứa các giá trị y được tạo bằng cách chuyển từng mẫu x cho hàm f[x]. Sau đó, chúng tôi chuyển hai danh sách đó tới hàm pyplot
import matplotlib.pyplot as plt2 với chuỗi định dạng là
import matplotlib.pyplot as plt7, kết nối các điểm mẫu với nhau để tạo ra một số lượng lớn các đoạn đường màu xanh lam. Vì các đoạn thẳng riêng lẻ khá ngắn, nên tác dụng của việc đặt tất cả chúng lại với nhau là tạo ra thứ trông giống như một đường cong mượt mà
Để tạo thuận lợi cho việc tạo các mẫu x và đánh giá chúng, chúng tôi sử dụng một cặp cách hiểu danh sách
Thông tin thêm về pyplot và matplotlib
Hai ví dụ tôi đã trình bày ở trên chứng minh đủ những gì pyplot có thể làm để đáp ứng nhu cầu vẽ đồ thị của chúng ta trong phần còn lại của khóa học. pyplot và matplotlib có khả năng làm được nhiều hơn thế và cung cấp các phương tiện để xây dựng nhiều loại ô khác nhau. Nếu bạn tò mò, tôi mời bạn truy cập trang web matplotlib chính thức tại matplotlib. tổ chức
Bài tập lập trình
Phương trình vi phân thường cấp một là phương trình có dạng
cùng với điều kiện ban đầu
x[0] = x0
Giải phương trình yêu cầu chúng ta tìm một biểu thức cho x[t] thỏa mãn cả phương trình và điều kiện ban đầu. Không phải tất cả các phương trình vi phân đều có thể được giải chính xác; . Trong bài tập này, chúng ta sẽ xem xét ba phương pháp như vậy
Khi chúng ta giải chính xác một phương trình vi phân, chúng ta đang cố gắng xác định hàm x[t] thỏa mãn phương trình và điều kiện ban đầu. Nếu chúng ta có thể tìm thấy x[t] thì tất nhiên chúng ta sẽ có thể đánh giá hàm nghiệm này tại bất kỳ thời điểm t nào. Các phương pháp mà chúng ta sắp xem xét bên dưới đều là các phương pháp cố gắng xây dựng các xấp xỉ cho x[t] tại các thời điểm bị cô lập. Cụ thể, chúng tôi sẽ cố gắng ước tính x[ti] cho tập hợp các điểm bị cô lập thành = t0 + h, trong đó h là kích thước bước mà chúng tôi chọn
Chúng ta hãy suy nghĩ một phút về cách chúng ta có thể tìm ra điểm đầu tiên trong số những điểm chưa biết này, x[t1]
Một cách để có được x[t1] là bắt đầu tại điểm đã biết [t0 , x0] và vẽ một đường thẳng có hệ số góc phù hợp để đạt được giá trị chính xác của x[t1]
Tất nhiên, vấn đề là chúng ta không biết chính xác độ dốc chính xác cần thiết để đạt được mục tiêu của mình. Các phương pháp khác nhau mà chúng ta sẽ nghiên cứu dưới đây đều nhằm mục đích thực hiện ngày càng tốt hơn công việc tính gần đúng độ dốc
Phương pháp đầu tiên sử dụng độ dốc duy nhất mà chúng tôi có sẵn cho chúng tôi làm dự đoán ban đầu cho độ dốc chính xác. Vì chúng ta biết cả t0 và x0, nên chúng ta có thể thế chúng vào phương trình vi phân để tính hệ số góc của x[t] tại t = t0
Nếu chúng ta sử dụng cái này làm hệ số góc của mình và đi theo đường thẳng đến t = t1, chúng ta sẽ đến một điểm
x1 = x[t0] + f[t0 , x0] [t1 - t0] = x[t0] + f[t0 , x0] h
đó là một ước tính khá tồi cho x[t1]. Hình ảnh dưới đây minh họa tình hình
Từ [t1 , x1] chúng ta chỉ cần lặp lại quá trình
x2 = x1 + f[t1 , x1] [t2 - t1] = x1 + f[t1 , x1] h
Tổng quát hơn, phương pháp này đưa chúng ta từ một điểm ước tính [tn , xn] đến một ước tính mới [tn+1 , xn+1] thông qua quy trình
tn+1 = tn + h
k1 = f[tn, xn]
xn+1 = xn + k1 h
Một lần nữa, tôi muốn nhấn mạnh rằng đây là một phương pháp tệ hại [như hình trên cho thấy]. Chúng ta có thể cải thiện phương pháp một chút bằng cách giảm kích thước bước h. Với kích thước bước nhỏ hơn theo hướng t, sẽ có ít cơ hội hơn để điểm ước tính x1 khác với giá trị thực của giải pháp, x[t1]. Quan trọng hơn, chúng ta có thể cải thiện phương pháp bằng cách thay thế độ dốc k1 mà chúng ta đã sử dụng cho phương pháp này bằng một độ dốc tốt hơn giúp chúng ta tiến gần hơn đến điểm mục tiêu tốt hơn
Phương pháp Euler đã sửa đổi cố gắng cải thiện phương pháp Euler bằng cách sử dụng trung bình của một vài đạo hàm làm phép tính gần đúng tốt hơn cho độ dốc bí ẩn mà chúng ta tìm kiếm. Phương pháp Euler đã sửa đổi bắt đầu bằng cách sử dụng phương pháp Euler để tính một giá trị gần đúng cho x[tn+1] được gọi là p1. Thay tn+1 và giá trị gần đúng của x vào phương trình vi phân cung cấp một giá trị gần đúng cho đạo hàm x
Dưới đây là các công thức có liên quan
tn+1 = tn + h
k1 = f[tn , xn]
p1 = xn + k1 h
k2 = f[tn+1 , p1]
Mặc dù cả hai phương pháp Euler và Euler đã sửa đổi đều rất dễ hiểu, nhưng cả hai phương pháp này đều không thực hiện tốt công việc xấp xỉ giải pháp chính xác cho một vấn đề. Để có kết quả tốt hơn, chúng ta thường phải áp dụng các phương pháp phức tạp hơn. Một phương pháp thường tạo ra kết quả khá tốt là phương pháp Runge-Kutta. Giống như cả hai phương pháp Euler và Euler đã sửa đổi, phương pháp này sử dụng các điểm xn đã được tính trước đó kết hợp với thông tin từ hàm f[t,x[t]] để tính các điểm tiếp theo xn+1. Để làm điều này, Runge-Kutta sử dụng một bộ công thức phức tạp hơn, như được hiển thị ở đây
tn+1 = tn + h
k1 = f[tn , xn]
k2 = f[tn + h/2 , xn + k1 h/2 ]
k3 = f[tn + h/2 , xn + k2 h/2 ]
k4 = f[tn + h , xn + k3 h]
Đây là một vấn đề cụ thể mà chúng ta sẽ làm việc với nhiệm vụ này
Viết chương trình sử dụng phương pháp Runge-Kutta để xây dựng dãy các điểm nghiệm gần đúng [tn , xn] bắt đầu từ [t0 , x0] = [0 , 1/2] và kết thúc tại t = 1. 0. Cho phép người dùng nhập số bước N cần thực hiện. N bước tương ứng với giá trị h = 1/N. Sử dụng giá trị đó của h để chương trình của bạn tính toán danh sách các ước tính cho x
Cuối cùng, yêu cầu chương trình của bạn tạo ra một biểu đồ các điểm ước tính cùng với một đường cong cho giải pháp thực tế. Giải pháp thực tế cho phương trình vi phân này là