2017-07-01 19 views
8

Không giống như Matlab, Ký hiệu Octave không có hàm piecewise. Có một công việc xung quanh? Tôi muốn làm một cái gì đó như thế này:Chức năng Piecewise trong gói ký hiệu Octave?

 
syms x 
y = piecewise(x0, 1) 

Liên quan, làm thế nào để có được một phần của một chức năng piecewise? Tôi chạy như sau:

 
>> int (exp(-a*x), x, 0, t) 

Và có câu trả lời đúng sau hiển thị và lưu trữ trong một biến:

                     
     t  for a = 0 

     -a*t 
    1 e 
    - - ----- otherwise 
    a  a 

Nhưng bây giờ tôi muốn truy cập vào "khác" là một phần của câu trả lời vì vậy tôi có thể yếu tố đó. Làm thế nào để làm điều đó?

(Có, tôi có thể đưa nó vào đầu mình, nhưng tôi đang thực hành khi có nhiều biểu thức phức tạp hơn. Tôi cũng chỉ thực sự tìm cách tiếp cận bằng cách sử dụng biểu thức - mặc dù trong bất kỳ số trường hợp nào có thể hoạt động tốt, tôi muốn hiểu cách tiếp cận tượng trưng.)

Cảm ơn!

+0

Có , Tôi phải sử dụng

sym
. Tôi không gặp khó khăn gì khi viết các hàm piecewise chỉ là số. – forkandwait

Trả lời

0

Chức năng piecewise của Matlab có vẻ khá mới (được giới thiệu trong năm 2016b), nhưng về cơ bản nó trông giống như một toán tử ternary được vinh danh. Thật không may là tôi không có năm 2016 để kiểm tra xem nó có thực hiện bất kỳ kiểm tra nào về đầu vào hay không, nhưng nói chung bạn có thể tạo lại toán tử 'ternary' trong quãng tám bằng cách lập chỉ mục vào một ô bằng cách sử dụng lập chỉ mục logic. Ví dụ.

{@() return_A(), @() return_B(), @() return_default()}([test1, test2, true]){1}() 

Giải thích:

  • Bước 1: Bạn đặt tất cả các giá trị của lãi suất trong một mảng di động. Bọc chúng trong các chốt điều khiển chức năng nếu bạn muốn ngăn chúng được đánh giá tại thời điểm phân tích cú pháp (ví dụ nếu bạn muốn đầu ra của toán tử bậc ba tạo ra lỗi)
  • Bước 2: Chỉ mục mảng ô này bằng cách sử dụng chỉ mục logic, ở mỗi chỉ số bạn thực hiện kiểm tra lôgic
  • Bước 3: Nếu bạn cần một trường hợp 'mặc định', hãy sử dụng thử nghiệm 'true' cho phần tử cuối cùng.
  • Bước 4: Từ mảng ô (phụ) kết quả từ trên xuống, chọn phần tử đầu tiên và 'chạy' xử lý hàm kết quả. Việc chọn phần tử đầu tiên có tác dụng nếu nhiều hơn một thử nghiệm thành công, bạn chỉ chọn kết quả đầu tiên; cho thử nghiệm 'mặc định' sẽ luôn thành công, điều này cũng đảm bảo rằng điều này không được chọn trừ khi đó là thử nghiệm đầu tiên và duy nhất thành công (theo mặc định).

Dưới đây là các bước trên được thực hiện vào một chức năng (kiểm tra sự tỉnh táo thích hợp bỏ qua ở đây cho ngắn gọn), sau cú pháp tương tự như piecewise matlab của: sử dụng

function Out = piecewise (varargin) 
    Conditions = varargin(1:2:end); % Select all 'odd' inputs 
    Values  = varargin(2:2:end); % Select all 'even' inputs 
    N   = length (Conditions); 
    if length (Values) ~= N   % 'default' case has been provided 
    Values{end+1} = Conditions{end}; % move default return-value to 'Values' 
    Conditions{end} = true;   % replace final (ie. default) test with true 
    end 

    % Wrap return-values into function-handles 
    ValFuncs = cell (1, N); 
    for n = 1 : N; ValFuncs{n} = @() Values{n}; end 

    % Grab funhandle for first successful test and call it to return its value 
    Out = ValFuncs([Conditions{:}]){1}(); 
end 

Ví dụ:

>> syms x t; 
>> F = @(a) piecewise(a == 0, t, (1/a)*exp(-a*t)/a); 

>> F(0) 
ans = (sym) t 

>> F(3) 
ans = (sym) 

    -3⋅t 
    ℯ 
    ───── 
    9 
Các vấn đề liên quan