2015-12-12 16 views
5

Tôi đang tái tạo kết quả Mathematica bằng cách sử dụng Sympy và tôi mới sử dụng kết quả sau, vì vậy tôi có thể đang làm sai. Tuy nhiên, tôi nhận thấy rằng một số công cụ mất một phút tối đa bằng cách sử dụng Mathematica là chỉ mất mãi mãi (đọc: đã không kết thúc sau khi tôi bắt đầu nó một giờ trước) trong sympy. Điều đó áp dụng cả hai cho Simplify()solve(). Tôi đang làm điều gì đó sai, hoặc là thực sự là trường hợp?Nó có thể là `sympy` là nhiều, chậm hơn nhiều so với Mathematica?

tôi sẽ đính kèm solve() trường hợp của tôi:

import sympy as sp 
from sympy import init_printing 
init_printing() 

p, r, c, p, y, Lambda = sp.symbols('p r c p y Lambda') 

F = sp.Symbol('F') 
eta1 = lambda p: 1/(1-sp.exp(-Lambda) * sp.exp(-Lambda)*(sp.exp(Lambda) - 1 - Lambda)) 
eta2 = lambda p: 1/(1-sp.exp(-Lambda)) * sp.exp(-Lambda)/(1-F) * (sp.exp(Lambda*(1- F)) - 1 - Lambda*(1-F)) 

eta = lambda p: 1 - eta1(p) + eta2(p) 
etaOfR = sp.limit(eta(p), F, 1) 

S = lambda p: eta(p)*y/p*(p-c) 
SOfR = etaOfR*y/r*(r-c) 
sp.solve(S(p)-SOfR, F) 

Mã Mathematica tương ứng:

ClearAll[r, p, lambda, a, A, c, eta, f, y, constant1, constant2, eta, \ 
etaOfR] 
constant1[lambda_] := Exp[-lambda]/(1 - Exp[-lambda]); 
constant2[lambda_] := constant1[lambda]*(Exp[lambda] - 1 - lambda); 
eta[lambda_, f_] := 
    1 - constant2[lambda] + 
    constant1[lambda]*(Exp[lambda*(1 - f)] - 1 - lambda*(1 - f)) ; 
etaOfR[lambda_] := Limit[eta[lambda, f], f -> 1]; 
expression1[lambda_, f_] := 
    y/p (p - c) eta[lambda, f] == y/r (r - c) etaOfR[lambda]; 

Solve[expression1[lambda, f], f] // FullSimplify 

Output:

{{f -> (-(1 + lambda) p r + 
    c (lambda p + r) + (c - 
     p) r ProductLog[-E^(((-c lambda p + (c (-1 + lambda) + 
      p) r)/((c - p) r)))])/(lambda (c - p) r)}} 
+0

Cảm giác ban đầu của tôi là Mathematica có khả năng tốt hơn nhiều so với Sympy tại thời điểm này, với khởi đầu lớn mà nó có. – chthonicdaemon

+0

tại sao bạn định nghĩa các hàm bằng 'lambda'? – MaxNoe

+0

@MaxNoe vì hướng dẫn không đề cập đến cách xác định các chức năng, tôi lẩn tránh và thấy mọi người trên internet làm điều này. – FooBar

Trả lời

5

Cách đúng để làm điều đó là:

from sympy import * 
init_printing() 
p, r, c, p, y, lam, f = symbols('p r c p y lambda f') 
constant1 = exp(-lam)/(1 - exp(-lam)) 
constant2 = constant1 * (exp(lam) - 1 - lam) 
eta = 1 - constant2 + constant1 * (exp(lam * (1-f)) - 1 - lam * (1 - f)) 
etaOfR = limit(eta, f, 1) 
expression1 = Eq(y/p * (p - c) * eta, 
      y/r * (r - c) * etaOfR) 
solve(expression1, f) 

Bạn cũng có thể kiểm tra các máy tính xách tay ở đây: http://nbviewer.ipython.org/gist/jankoslavic/0ad7d5c2731d425dabb3

Kết quả là tương đương với một từ Mathematica (xem dòng cuối cùng) và hiệu suất Sympy có thể so sánh.

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