2010-09-10 68 views
11

Tôi đang cố gắng tạo ra một chức năng biểu tượng piecewise trong Matlab. Lý do nó phải là biểu tượng là tôi muốn có khả năng tích hợp/phân biệt chức năng sau đó và/hoặc chèn các giá trị thực tế. Tôi có chức năng sau:Xây dựng chức năng biểu tượng piecewise trong Matlab

x^3/6 -> 0 < x <= 1 
(1/6)*(-3*x^3+12*x^2-12x+4) -> 1 < x <= 2 
(1/6)*(3*x^3-24*x^2+60x-44) -> 2 < x <= 3 
(1/6)*(4-x)^3 -> 3 < x <= 4 
0 -> otherwise 

Ví dụ, tôi muốn đặt chức năng này trong một biến (giả sử f) và sau đó gọi

int(diff(f, 1)^2, x, 0, 4) % numbers could be different 

và nhận được (vô hướng) cho kết quả 2/3 .

Tôi đã thử nhiều thứ khác nhau, liên quan đến hàm piecewise() và so sánh tượng trưng, ​​nhưng không có gì hiệu quả ... bạn có thể trợ giúp không? :-)

Trả lời

9

Một lựa chọn là sử dụng heaviside chức năng để làm cho mỗi phương trình bằng zero bên ngoài phạm vi nhất định của nó, sau đó thêm tất cả chúng lại với nhau thành một phương trình:

syms x; 
f = (heaviside(x)-heaviside(x-1))*x^3/6 + ... 
    (heaviside(x-1)-heaviside(x-2))*(1/6)*(-3*x^3+12*x^2-12*x+4) + ... 
    (heaviside(x-2)-heaviside(x-3))*(1/6)*(3*x^3-24*x^2+60*x-44) + ... 
    (heaviside(x-3)-heaviside(x-4))*(1/6)*(4-x)^3; 
double(int(diff(f, 1)^2, x, 0, 4)) 

ans = 

    0.6667 

Một lựa chọn khác là để thực hiện hội nhập của bạn cho mỗi chức năng trên mỗi subrange sau đó thêm các kết quả:

syms x; 
eq1 = x^3/6; 
eq2 = (1/6)*(-3*x^3+12*x^2-12*x+4); 
eq3 = (1/6)*(3*x^3-24*x^2+60*x-44); 
eq4 = (1/6)*(4-x)^3; 
total = int(diff(eq1, 1)^2, x, 0, 1) + ... 
     int(diff(eq2, 1)^2, x, 1, 2) + ... 
     int(diff(eq3, 1)^2, x, 2, 3) + ... 
     int(diff(eq4, 1)^2, x, 3, 4) 

total = 

2/3 

UPDATE:

Mặc dù được đề cập trong câu hỏi rằng chức năng piecewise không hoạt động, Karan's answer đề xuất tính năng này, ít nhất là trong các phiên bản mới hơn. Các tài liệu cho piecewise hiện nói rằng nó đã được giới thiệu trong R2016b, nhưng nó đã được trình bày rõ ràng sớm hơn nhiều. Tôi tìm thấy nó trong tài liệu cho các Symbolic Math Toolbox như xa trở lại như R2012b, nhưng cú pháp gọi là khác nhau hơn bây giờ. Tôi không thể tìm thấy nó trong tài liệu trước đó cho Symbolic Math Toolbox, nhưng nó đã hiển thị như một hàm trong các hộp công cụ khác (chẳng hạn như Statistics và Spline Toolboxes), giải thích đề cập của nó trong câu hỏi (và tại sao nó không làm việc cho các phương trình tượng trưng vào thời điểm đó).

+0

Nó phải là 60 * x. – Jonas

+0

@ Jonas: Cảm ơn. '12x' cũng cần được sửa. – gnovice

+0

Về _as xa trở lại như R2012b_, bạn có thể đề cập đến chức năng piecewise MuPAD, đó là một giao diện khác nhau từ hộp công cụ Mathic Math. Đối với SMT, nó đã được giới thiệu trong R2016b. Xin lỗi về sự nhầm lẫn với các hộp công cụ. Hãy cho tôi biết nếu tôi có thể trả lời bất kỳ câu hỏi nào khác. –

3

Bắt đầu R2016b, sử dụng các chức năng piecewise

syms x 
y = piecewise(x<0, -1, x>0, 1) 

y = 
piecewise(x < 0, -1, 0 < x, 1) 

Đối với trường hợp này:

syms x 
f = piecewise(... 
0< x <=1, x^3/6, ... 
1 < x <= 2, (1/6)*(-3*x^3+12*x^2-12*x+4), ... 
2 < x <= 3, (1/6)*(3*x^3-24*x^2+60*x-44), ... 
3 < x <= 4, (1/6)*(4-x)^3, ... 
0) 

f = 
piecewise(x in Dom::Interval(0, [1]), x^3/6, x in Dom::Interval(1, [2]), - x^3/2 + 2*x^2 - 2*x + 2/3, x in Dom::Interval(2, [3]), x^3/2 - 4*x^2 + 10*x - 22/3, x in Dom::Interval(3, [4]), -(x - 4)^3/6, 0) 

int(diff(f, 1)^2, x, 0, 4) 
ans = 
2/3 
+0

Giải thích cho các downvotes sẽ là hữu ích, vì đây là phương pháp được đề nghị để tạo ra các chức năng piecewise trong Symbolic Math Toolbox. –

+0

Tôi đoán các downvotes là vì ví dụ cũ của bạn không phù hợp với câu hỏi ở tất cả; ví dụ mới của bạn nên khắc phục điều đó. Ngoài ra, cập nhật trong câu trả lời của tôi có thể được quan tâm. Mọi người có thể đã downvoted bởi vì câu hỏi cụ thể đề cập đến 'piecewise' không hoạt động, mà nó thực sự không vào thời điểm nó được hỏi, nhưng hiện tại như bạn thấy. – gnovice

+0

Đủ công bằng. Tôi hy vọng câu trả lời đã chỉnh sửa của tôi hữu ích. Vui lòng trả lời bất kỳ câu hỏi nào khác. –

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