利用描點繪圖法求解複雜函數

假設有一個複雜函數(以一元爲例),且是關於自變量的隱函數,即 f(x) = y 無法寫出 x = g(y) 的表達式,那麼就可以採用圖像法求解。


需要用到的庫爲 numpy 和 matplotlib,在這裏以 openSUSE 12.2 x64 爲例:

sudo zypper in python-numpy python-matplotlib python-matplotlib-tk

其餘 Linux 系統相似。Windows 系統需要去官方網站下載編譯好的 exe 文件安裝庫。


範例代碼:

#!usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import division	#除法糾正
import numpy as np
import matplotlib.pyplot as plt

# 基本常數定義

# 隱函數定義

def f(x):
	y = f(x)
	return y

# 定義自變量如何取值
xx = np.arange(-1,1,0.1)

def calc():	#計算並繪圖
	a,b = [],[]	#建立繪製點的座標列表
	for x in xx.tolist():	#要將array對象轉換成列表對象
		det = matrix(x)
		a.append(x)
		b.append(y)
	plt.plot(a,b)	#繪製圖形
	plt.show()	#顯示圖形

if __name__=='__main__':
	calc()

運行之後便可以得到曲線了:


左下角有移動、放大、保存圖像等等選項,比較方便。

其實 plot 可以直接繪製函數圖像,得到非常光滑的曲線,在曲線上取點所得的值也會準確很多;但這裏之所以採用描點的方法,是出於對隱函數特殊情況的考慮,比如隱函數中有矩陣的計算的話,使用 numpy.linalg.det() 函數求矩陣的值,就對變量輸入有着類型的要求,不能是數組,否則會產生諸如

ValueError: setting an array element with a sequence

這樣的錯誤,我是覺得有點麻煩,而描點相對簡單,更改自變量取值的步進長度就可以更改精度了,只要不是要求太精確的一般都可以滿足需要。


至於二元函數 z = h(x,y),則同樣可以通過繪製 3D 圖像來求解。需要用到的是 mlab 這個庫。具體可以 Google。


方法還有很多,numpy 和 matplotlib 的強大遠遠不止於此,但這一次課程設計,好像這樣就比較夠了。我感覺只要庫強大,python 能做的是不輸給 matlab 的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章