6

Tôi đang cố gắng thực hiện tối ưu hóa số của chức năng "hộp đen" trong Mathematica. Sơ đồ nó đi như thế này:Mathematica: Thứ tự đánh giá trong khi tối ưu hóa số chức năng hộp đen

NMinimize[{comb[x,y,z], x > 0}, {x,y,z}] 

nơi lược [x, y, z] được định nghĩa tương tự như thế này:

comb[x_,y_,z_] := Module[{}, 
    Print[x,y,z]; 
    M = FindMaximum[SkewNormal[a,x,y,z], {a,x}] // First; 
    val = f[x,y,z,M]; 
    Return[val]; 
]; 

Tuy nhiên, tất cả các chức năng giảm thiểu Tôi đã cố gắng dường như không ngay lập tức cung cấp chải [x, y, z] với các giá trị số, và nó kết thúc cố gắng đánh giá FindMaximum với các giá trị ký hiệu cho x, y, z (dễ dàng xác minh vì In [x, y, z] cũng đánh giá biểu tượng). Do đó Findmaximum không thành công (FindMaximum :: nrnum: Giá trị hàm blah blah không phải là số thực) và do đó việc giảm thiểu thất bại.

Làm cách nào để khắc phục thứ tự đánh giá sao cho các hàm con của lược được đánh giá bằng các giá trị số?

+1

Một vấn đề khác (tinh tế hơn) vì xử lý trước biểu tượng trong 'NMinimize' gần đây đã được giải quyết trong [thread khác] (http://stackoverflow.com/questions/6971536/nminimize-eats-all-memory- bc-of-unn-symbolic-work/6975501 # 6975501) bởi Daniel Lichtblau. –

+0

Hmm ok cảm ơn tôi sẽ kiểm tra xem. Tôi cũng chỉ nhận thấy rằng vấn đề này không xảy ra trong Mathematica 8 (tôi đã chạy 7 trước đó). –

Trả lời

4

Làm thế nào về việc thay đổi comb để

comb[x_?NumericQ, y_?NumericQ, z_?NumericQ] := 
Module[{}, Print[x, y, z]; 
M = FindMaximum[SkewNormal[a, x, y, z], {a, x}] // First; 
val = f[x, y, z, M]; 
Return[val];]; 

mà làm cho định nghĩa của comb được đánh giá chỉ nếu đối số của nó là những con số?

+1

Không có ích gì. Chức năng của tôi thực sự đã làm điều đó rồi, tôi chỉ cần gỡ bỏ các bit đó cho mục đích đặt câu hỏi này. –

+1

@Bằng lạ rằng 'In' cũng sẽ hiển thị các giá trị tượng trưng, ​​vì' lược [x, y, z] 'với các giá trị ký hiệu sẽ không khớp với định nghĩa mà tôi đã đưa ra. Bạn có 'Clear [comb]' trước khi chạy nó không? Có lẽ nó phù hợp với định nghĩa mà không có bit 'NumericQ'. – acl

+0

@acl Điều này đã không làm việc cho tôi lúc đầu, nhưng sau khi thanh toán bù trừ nó đã làm các trick. –

5

Thứ tự đánh giá cho FindMinimum, FindMaximum, FindRootFindFit được ghi lại trên trang tài liệu tutorial/UnconstrainedOptimizationSymbolicEvaluation. Tôi nghĩ rằng một cái gì đó rất giống nhau được áp dụng cho các chức năng NMinimize. Mô tả là khá dài vì vậy tôi sẽ trích dẫn ở đây chỉ là giải pháp đề xuất từ ​​trang đó:

Nếu chức năng của bạn là như vậy mà đánh giá mang tính biểu tượng sẽ không giữ chức năng như mong muốn hoặc sẽ tốn chậm, bạn nên xác định chức năng của bạn để nó chỉ đánh giá cho các giá trị số của các biến số . Cách đơn giản nhất để làm điều này là xác định hàm của bạn bằng cách sử dụng PatternTest (?), Như trong f [x_? NumberQ]: = definition.

Có vẻ như việc đánh giá biểu tượng chỉ tạo ra sự phiền toái vì bạn phải xác định chức năng cụ thể để ngăn chặn nó. Tuy nhiên, mà không có đánh giá biểu tượng, thật khó để Mathematica có được lợi thế của sự kết hợp độc đáo giữa sức mạnh số và biểu tượng. Đánh giá biểu tượng nghĩa là các lệnh có thể mang lại lợi ích lợi ích từ phân tích biểu tượng, chẳng hạn như xác định thuật toán, tính toán tự động các dẫn xuất, tối ưu hóa tự động và biên dịch và phân tích cấu trúc.

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