2011-12-20 24 views
5

Hãy xem xét một tình huống mà bạn có dữ liệu trong một danh sách các hình thứcTạo điều khoản của một chuỗi lũy thừa m-trật tự trong biến n

data = {{x1, x2, x3, ..., xn, y}, {...}, ..., {...}} 

Ví dụ,

data = {{0, 2, 3, 2}, {0, 0, 1, 4}, {7, 6, 8, 3}} 

Tôi muốn phù hợp với những dữ liệu vào một đa thức đa biến về trật tự, nói, 2. Vì vậy, các giá trị chức năng 3 biến là:

{2, 4, 3} 

tại các điểm tương ứng

{{0, 2, 3}, {0, 0, 1}, {7, 6, 8}} 

Tôi muốn nói một cái gì đó giống như

Fit[data, {1, x, y, z, x^2, y^2, z^2, x y , x z, y z}, {x, y, z}] 

Đây là tất cả đều rất tốt đẹp, nhưng tôi không thể chỉ có dữ liệu 3 variate, có thể có một số tùy biến, và tôi không biết cách lập trình tạo tất cả các thuật ngữ tuyến tính, bậc hai hoặc thậm chí cao hơn, để chèn chúng làm đối số thứ hai của Fit [].

Đối ngày 4 variate làm lệnh thứ hai, nó sẽ là một cái gì đó như:

{1, x1, x2, x3, x4, x1^2, x2^2, x3^2, x4^2, x1 x2, x1 x3, x1 x4, x2 x3, x2 x4, x3 x4} 

Có cách nào tôi có thể tạo ra như một danh sách cho n biến, để m trật tự -thứ? Giống như các cụm từ (không có hệ số) trong việc mở rộng chuỗi m cấp hàng loạt của hàm n-biến đổi.

+0

Những người này có nên là 'x y' thay vì' xy' không? – kennytm

+0

tất nhiên, sry về điều đó. – vedran

Trả lời

8

Điều này có làm những gì bạn muốn không?

Union[Times @@@ Tuples[{1, x, y, z}, 2]] 
+0

Điều này thực hiện chính xác những gì tôi muốn. :) Cảm ơn bạn! – vedran

+0

Vui vì tôi có thể giúp đỡ. –

3

Sử dụng @ giải pháp gọn gàng ruebenko của,

varsList[y_, n_?IntegerQ, k_?IntegerQ] := 
Union[Times @@@ 
Tuples[Prepend[Table[Subscript[y, i], {i, 1, n}], 1], k]] 

Bạn có thể tạo danh sách mong muốn qua varsList[x, 4, 2].

2

Dưới đây là một phương pháp mà tôi tin là có giá trị biết:

set = {1, x, y, z}; 

Union @@ Outer[Times, set, set] 
6

Trong khi các giải pháp của @ruebenko là hoàn toàn đúng, tôi muốn đề cập đến rằng nó sẽ khá chậm đối với quyền hạn cao hơn/số lượng lớn của các biến, vì sự phức tạp của Tuples và nhiều bản sao cho các quyền hạn cao hơn. Dưới đây là một phương pháp đại số với một hiệu suất tốt hơn đối với những trường hợp (cả thời gian chạy và bộ nhớ-khôn ngoan):

List @@ Expand[(1 + x + y + z + t)^2] /. a_Integer*b_ :> b 

đây là một so sánh cho số lượng lớn các biến:

In[257]:= (res1=Union[[email protected]@@Tuples[{1,x,y,z,t},9]])//Short//Timing 
Out[257]= {19.345,{1,t,t^2,t^3,t^4,t^5,t^6,t^7,t^8,t^9,x,<<694>>,x^2 z^7,y z^7, 
     t y z^7,x y z^7,y^2 z^7,z^8,t z^8,x z^8,y z^8,z^9}} 

In[259]:= ([email protected]@Expand[(1+x+y+z+t)^9]/. a_Integer*b_:>b)//Short//Timing 
Out[259]= {0.016,{1,t,t^2,t^3,t^4,t^5,t^6,t^7,t^8,t^9,x,<<694>>,x^2 z^7,y z^7, 
     t y z^7,x y z^7,y^2 z^7,z^8,t z^8,x z^8,y z^8,z^9}} 

In[260]:= res1===res2 
Out[260]= True 

Trong này trường hợp, chúng tôi quan sát một tốc độ 1000x, nhưng nói chung hai phương pháp chỉ có những phức tạp tính toán khác nhau. Đoạn mã trên là một ứng dụng của một phương pháp chung và đẹp, được gọi là Lập trình đại số. Đối với một cuộc thảo luận thú vị về nó trong bối cảnh của Mathematica, xem điều này Mathematica Journal paper bởi Andrzej Kozlowski.

+1

+1, nội dung hay! Nhưng bạn biết đấy, nếu bạn FindFit với 700 vars, 20 giây. cho các vars có nhiều khả năng là mối quan tâm của bạn ít nhất ;-) –

+0

giải pháp tối ưu hóa tốt đẹp! thanks :) – vedran

+0

@ruebenko Chắc chắn, đây không phải là để làm giảm giải pháp của bạn (mà tôi upvoted)! Về mặt khái niệm, phương pháp của bạn là tự nhiên hơn. Đây chỉ là thông tin cơ bản - và ai biết được, một số người có thể cần phải giải quyết cùng một vấn đề cho cái gì đó khác. –

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