2011-12-19 23 views
5

Tôi đang sử dụng chức năng tối ưu hóa của scipy.fsolve lần đầu tiên để tìm nguồn gốc của phương trình. Vấn đề là bất kỳ số nào tôi sử dụng làm giá trị đoán/ước tính là những gì tôi nhận được như câu trả lời của tôi (trong khoảng 8 chữ số thập phân). Khi sử dụng full_output = True, tôi lấy exitflag là '1', nghĩa là 'giải pháp hội tụ', theo nghĩa tốt nhất của tôi nên có nghĩa là đầu ra thực sự là gốc của phương trình.fsolve luôn trả về phỏng đoán/ước tính

Tôi biết có một số hữu hạn các gốc riêng biệt (được đặt cách nhau), như khi tôi vẽ đồ thị phương trình, tôi có thể thấy chúng. Ngoài ra, fsolve không thành công (cung cấp lỗi exitflags) khi tôi nhập điểm bắt đầu vào trong phạm vi sẽ trả về một giá trị không xác định (chia cho số không, căn bậc hai của giá trị âm). Nhưng bên cạnh đó nó luôn luôn trở lại điểm khởi đầu là gốc.

Tôi đã thử nghiệm fsolve với một phương trình rất đơn giản và nó hoạt động tốt, vì vậy tôi biết rằng tôi đang nhập tất cả mọi thứ tôi cần và nên sử dụng fsolve chính xác. Tôi cũng đã cố gắng xung quanh với một số đối số đầu vào, nhưng tôi không hiểu chúng rất rõ ràng và dường như không có gì thay đổi).

Dưới đây là các mã có liên quan (E là biến chỉ, mọi thứ khác có khác không giá trị):

def func(E): 
    s = sqrt(c_sqr * (1 - E/V_0)) 
    f = s/tan(s) + sqrt(c_sqr - s**2) 
    return f 

guess = 3 
fsolve(func, guess) 

mà chỉ kết quả đầu ra '3' và nói rằng, mặc dù 'Các giải pháp hội tụ.' các giải pháp gần nhất nên vào khoảng 2,8 và 4,7.

Có ai có ý tưởng nào về cách sửa lỗi này và nhận câu trả lời đúng (sử dụng fsolve) không?

+3

Có lẽ bạn chỉ là một người đoán rất tốt. –

+0

Giá trị cho 'V_0' là gì? –

+3

Bạn có thể cung cấp các giá trị cho 'V_0' và' c_sqr' không?Tôi đã thử đặt 'c_sqr = 100' và' V_0 = 10' và nó hội tụ chính xác với gốc 2.90496355. –

Trả lời

6

Tôi nghĩ rằng phương trình của bạn doesn không làm những gì bạn nghĩ. Đối với một điều, khi tôi thử nó, nó không trả lại đoán; nó trả về một số đóng để đoán. Nó rất không ổn định và dường như khó hiểu fsolve. Ví dụ:

>>> V_0 = 100 
>>> c_sqr = 3e8 ** 2 
>>> guess = 5 
>>> fsolve(func, guess) 
array([ 5.00000079]) 

Đây không phải là 5. Nó thậm chí không phải là 5 trong độ chính xác của máy. Nó cũng không phải là một thư mục gốc của phương trình:

>>> func(5.00000079) 
2114979.3239706755 

Nhưng hành vi của phương trình là khá khó lường anyway:

>>> func(5.0000008) 
6821403.0196130127 
>>> func(5.0000006) 
-96874198.203683496 

Vì vậy, rõ ràng là có một ngã tư không ở đâu đó xung quanh đó. Tôi muốn nói hãy nhìn vào phương trình của bạn. Hãy chắc chắn rằng bạn đang xác định đối số của tan trong radian, ví dụ.

+2

cảm ơn, tôi quên đặt đối số của tan trong radian. – scaevity

1

Bạn đã thử thay đổi chức năng của mình thành một cái gì đó thực sự tầm thường? Như thế này:

#!/usr/bin/python 
from scipy.optimize import fsolve 

def func(E): 
# s = sqrt(c_sqr * (1 - E/V_0)) 
# f = s/tan(s) + sqrt(c_sqr - s**2) 
    f = E**2 -3. 
    return f 

guess = 9 

sol=fsolve(func, guess) 
print sol, func(sol) 

Đối với tôi, mã ở trên không hội tụ đến nơi cần.

Ngoài ra, trong mã bạn đã cung cấp --- c_strV_0 là gì? Nếu trên thực tế chức năng của bạn phụ thuộc vào nhiều hơn một biến, và bạn đang đối xử với tất cả trong số họ nhưng có một thông số như liên tục, sau đó sử dụng args lập luận của fsolve, như thế này:

#!/usr/bin/python 
from scipy.optimize import fsolve 
from numpy import sqrt 

def func(E,V_0): 
    #s = sqrt(c_sqr * (1 - E/V_0)) 
    #f = s/tan(s) + sqrt(c_sqr - s**2) 
    f = E**2 -V_0 
    return f 

VV=4. 
guess = 9 
sol=fsolve(func, guess, args=(VV)) 

print sol, func(sol,VV) 
Các vấn đề liên quan