2009-03-04 25 views
7

Tôi có một vấn đề về toán học nhỏ. Tôi muốn có một chức năng với các đặc tính này:Chức năng toán đơn giản f (x) nào có các tính chất này?

  1. cho x lớn hơn nhiều so với 0: lim f (x) = x
  2. cho x nhỏ hơn nhiều so với 0: lim f (x) = 0
  3. và f (0) = 1 (xin lỗi, tôi đã ở đây f (1) = 1 mà đã sai!)
  4. f (x) nên monotonically increasing

Vì vậy, các chức năng nên trông hơi giống như điều này:

 ^
     | /
     |/
     |/
    ___.-+´ 
--´-----+------> 
     | 

Điều tốt nhất tôi có cho đến thời điểm này là x/(1 + e^(-x)) nhưng sau đó tôi nhận ra rằng nó giảm xuống dưới 0 và không tăng lên một cách đơn điệu.

Trợ giúp tuyệt vời để chơi xung quanh với chức năng này là GraphFunc Online.

Ngoài ra, sẽ rất hữu ích nếu chức năng này nhanh để tính toán vì tôi cần phải thực hiện nó rất thường xuyên.

EDIT: Tôi đang sử dụng chương trình này để giới hạn giá trị. Tôi có một thuật toán tối ưu hóa, sử dụng đường cong phù hợp với thuật toán Levenberg-Marquardt. Nhưng thuật toán này không cho phép các ràng buộc và tối ưu hóa trên toàn bộ các giá trị thực. Vì vậy, tôi cần một hàm như thế này để tôi có thể thêm một ràng buộc nhân tạo để hàm lớn hơn 0. Một cách tiếp cận đơn giản sẽ là sử dụng f(x) = x² nhưng sau đó hàm không tăng đơn điệu và nó có hai minimas.

Levenberg-Marquardt xấp xỉ các dẫn xuất, vì vậy tôi nghĩ nó sẽ là tốt nhất khi hàm cũng trơn tru. Nhưng tôi không chắc chắn nếu điều này là hoàn toàn cần thiết.

+0

Tôi không thấy cách liên quan đến chương trình này. –

+0

Tại thời điểm này, tôi mong đợi để xem nhiều hơn một thẻ ngôn ngữ. Giải thích lý do tại sao bạn làm điều này theo chương trình hoặc một cái gì đó như thế. – EBGreen

+0

Tôi có thể dễ dàng thấy cách liên quan đến lập trình này, nhưng có lẽ OP có thể thêm một số ngữ cảnh để thỏa mãn người khác. –

Trả lời

5

Ngoại trừ một sự gián đoạn tại 0, x/(1 - e^(-x)) hoạt động. Vì vậy, hãy xác định f (0) thành 1 và bạn đã đặt.

#define E 2.71828183 
double SimpleFunc(double x) 
{ 
    if (x == 0) 
     return 1; 
    return x/(1 - pow(E, (-x))); 
} 

có khả năng nhanh hơn:

double SimpleFunc2(double x) 
{ 
    if (x < 0) 
    return 1/(1 - x); 
    return x+1; 
} 

Cả hai đều liên tục trong phái sinh đầu tiên, nhưng điều thứ hai có một bước nhảy tại 1 trong đạo hàm bậc hai)

Nếu bạn thực sự không muốn để thực hiện chức năng khôn ngoan, hãy thử điều này: (x^2+.1)^.5/((1 - e^(-x))^2+.1)^.5

+0

đẹp! hơi nhanh hơn sẽ là x/(1 - e^(- x)) tất nhiên, do không có neg. –

+0

.. và trong biến thể "có khả năng nhanh hơn" của bạn, trên x> 0 trở lại x + 1 để giảm bớt sự gián đoạn. –

+0

Vâng, tôi cũng sẽ đề nghị x/(1 - e^(- x)), nhưng Iraimbilanja đánh tôi với nó. :) – grieve

3

f (x) = abs (x/2) + x/2

trong đó abs (x) là giá trị tuyệt đối của x

Hàm đơn giản này rõ ràng sẽ nhanh chóng tính toán và đáp ứng tất cả bốn tiêu chí.

+0

Ông yêu cầu f (1) là 1, không f (0) (mặc dù đồ thị của mình, không có quy mô, có thể gây hiểu nhầm ở đây). –

+0

Nó bỏ lỡ # 4: f (-10) = 10> 0 = f (0) –

0

Tôi không biết chính xác bạn đang sử dụng nó để làm gì; có gì sai với một chức năng piecewise? Nếu bạn sắp thực hiện nó rất nhiều, một cái gì đó như thế này sẽ nhanh hơn làm số mũ:

f(x) = -1/x, x < -1 
f(x) = 1, -1 <= x <= 1 
f(x) = x, x > 1 

EDIT: Cố định nó thực sự hoạt động.

+0

không xác định tại x = 0 và âm khi x <0 –

+0

@Patrick: D'oh! Cảm ơn. – Pesto

+0

Ngoài ra đối với hầu hết các mục đích, bạn thường muốn chuyển tiếp trơn tru từ cái này sang cái khác. –

1

Chỉ để cung cấp cho bạn ý tưởng, đây là giải pháp không có ràng buộc f (1) = 1 và không tăng lên một cách đơn điệu.

Về cơ bản, bạn muốn trộn giữa hai hàm: f1 (x) = 0 cho x < 0 và f2 (x) = x cho x> 0. Bạn muốn pha trộn trơn tru. Một hàm bước đơn giản với giới hạn không đổi tại -inf và + inf là atan (giới hạn là -pi/2 và + pi/2 tương ứng).

Vì vậy, việc kết hợp một chức năng atan pha trộn với f1 và f2, bạn nhận được:

pha trộn (x) = atan (x)/pi + 0,5 f (x) = (1 - pha trộn (x)) * f1 (x) + hỗn hợp (x) * f2 (x)

Mà cho:

f (x) = (atan (x)/pi + 0.5) * x

có lẽ khác các hàm pha trộn mà bạn có thể sử dụng thay cho hàm atan. Cũng lưu ý hơn với các giá trị âm nhỏ, f (x) sẽ âm.

Nếu bạn muốn đường cong của bạn đi qua (1,1), bạn có thể sử dụng thực tế là atan (0) = 0.

+0

DOH! Bạn đánh tôi bằng 40 giây! :) –

+0

Thực ra, nếu hàm có lim f (x) = x, và f (x) = x tại x = 1, hàm phải được định trước. – Doub

0

1/2 * (x + ABS (x))

Nó đơn điệu.

f (1) = 1.

Khi x nhỏ hơn 0, f (x) = 0, nếu không bằng x.

8

Dưới đây là một smooth function thỏa mãn yêu cầu của bạn:

f(x) = (x + sqrt(x^2 + 4))/2 

Đối với x = 0, bạn có thể thấy rằng f (x) = 1. Đối với x dương rất lớn, sqrt(x^2 + 4) khoảng x, do đó f (x) ≈ x. Cho x tiêu cực rất lớn, sqrt(x^2 + 4) khoảng -x, vì vậy f (x) ≈ 0.

Các phái sinh đầu tiên là

f'(x) = 1/2 + 1/2*x/sqrt(x^2 + 4) 

Đối với x> 0, x/sqrt(x^2 + 4) > 0, vì vậy f '(x)> 0 . đối với x < 0,

0 < x^2/(x^2 + 4) < 1 
0 < |x|/sqrt(x^2 + 4) < 1 
-1 < x/sqrt(x^2 + 4) < 0 
-1/2 < 1/2*x/sqrt(x^2 + 4) < 0 
1/2 + 1/2*x/sqrt(x^2 + 4) > 0 

Do đó, f '(x)> 0 với mọi x, do đó f (x) là đơn điệu tăng như mong muốn.

+0

Cảm ơn rất nhiều, tôi cũng sử dụng nó. Tôi ước tôi có thể chấp nhận hai câu trả lời :) – martinus

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