2011-09-10 19 views
12

Nói rằng tôi có một hàm điên, f, được xác định như sau:NMinimize có vẻ là trên vết nứt

util[x_, y_, c_] := 0.5*Log[c-x] + 0.5*Log[c-y] 
cost[x_, y_, l_] := c /. First[NSolve[util[x, y, c+l] == Log[10+l], c]] 
prof[x_, y_] := 0.01*Norm[{x,y}, 2] 
liquid[x_, y_] := 0.01*Norm[{x,y}, 2] 
f[x_, y_, a_, b_] := cost[a, b, liquid[x,y] + liquid[a-x, b-y]] - Max[a,b] 
     - cost[0,0,0] + prof[x,y] + liquid[x,y] + prof[a-x, b-y] + liquid[a-x, b-y] 

Bây giờ tôi gọi NMinimize như thế này:

NMinimize[{f[50, 50, k, j], k >= 49, k <= 51, j >= 49, j <= 51}, {j, k}] 

nào nói với tôi điều này:

{-21.0465, {j -> 51., k -> 49.}} 

Nhưng sau đó nếu tôi thực sự kiểm tra xem f[50,50,49,51] là gì, nó là:

0.489033 

Điều này khá khác so với -21.0465 mà NMinimize cho biết. Đây có phải là mệnh đề cho khóa học với NMinimize không? Lỗi dấu chấm động phức tạp hay không? Bất kỳ ý tưởng nào để đánh bại NMinimize (hoặc một số chức năng như vậy) thành bài nộp?

+4

+1 cho tiêu đề – Verbeia

Trả lời

17

Nó chắc chắn có vẻ liên quan đến chức năng của bạn f không bị giới hạn đối số bằng số, cộng với tiền xử lý biểu tượng được thực hiện bởi NMinimize. Khi bạn thay đổi chữ ký thành

f[x_?NumericQ, y_?NumericQ, a_?NumericQ, b_?NumericQ]:=... 

Kết quả là như mong đợi, mặc dù mất nhiều thời gian hơn để tải xuống.

EDIT

Chúng ta có thể đào sâu hơn để lộ lý do thực sự. Đầu tiên, lưu ý rằng f của bạn (một trong những bản gốc, args không hạn chế) là khá một hàm:

In[1423]:= f[50,50,49.,51.] 
Out[1423]= 0.489033 

In[1392]:= f[50,50,k,j]/.{j->51.`,k->49.`} 
Out[1392]= -21.0465 

Thủ phạm thực sự là NSolve, mang đến cho hai giải pháp ra lệnh:

In[1398]:= NSolve[util[x,y,c+l]==Log[10+l],c] 
Out[1398]= {{c->0.5 (-2. l+1. x+1. y-2. Sqrt[100.+20. l+1. l^2+0.25 x^2-0.5 x y+0.25 y^2])}, 
{c->0.5 (-2. l+1. x+1. y+2. Sqrt[100.+20. l+1. l^2+0.25 x^2-0.5 x y+0.25 y^2])}} 

Vấn đề là , thứ tự là gì. Hóa ra là khác nhau đối với các đối số dạng ký hiệu và số cho NSolve, bởi vì trong trường hợp sau chúng ta không có bất kỳ biểu tượng nào xung quanh. Điều này có thể được xem là:

In[1399]:= 
Block[{cost}, 
    cost[x_,y_,l_]:=c/.Last[NSolve[util[x,y,c+l]==Log[10+l],c]]; 
    f[50,50,k,j]/.{j->51.,k->49.}] 

Out[1399]= 0.489033 

Vì vậy, bạn thực sự phải giải quyết đúng thứ tự cho bạn và giải pháp nào bạn thực sự muốn chọn.

+1

Chà, rất hay trong việc phát hiện vấn đề đó với NSolve! Cảm ơn Leonid! – dreeves

+0

@dreeves Daniel, vui vì tôi có thể giúp. Trong một thời gian, tôi khá bối rối - không biết trước điều này có thể xảy ra. –

+0

FYI, 51 và 49 là ngược trong 'In [1400]' (nhưng bạn nhận được kết quả tương tự bất kể!) – JxB

Các vấn đề liên quan