Bu soruna yaklaşımın iki yolu vardır: sayısal ve sembolik.
Sayısal olarak çözmek için, önce bunu bir "runnable" işlevi olarak kodlamanız gerekir - bir değer girme, bir değer elde etme. Örneğin, bir işlevi otomatik olarak oluşturmak için bir dizeyi ayrıştırmak oldukça mümkündür; 2x + 6
'u [6, 2]
(liste dizininin x - yani 6 * x^0 + 2 * x^1) değerine böldüğünü söyleyin.Ardından:
def makePoly(arr):
def fn(x):
return sum(c*x**p for p,c in enumerate(arr))
return fn
my_func = makePoly([6, 2])
my_func(3) # returns 12
Ardından arka arkaya İşlevinizden içine bir x-değeri takılan sonucu ve bulmak istiyorsa ne arasındaki fark bakar ve onun x değerini tweaks başka işlev gerekir (umarım) en aza indirmek fark. (X^2 + 2 = 0 olarak hiçbir gerçek değerli cevaplar vardır yani) işlevi aslında bir çözümü var olduğunu varsayarak, iyi bir başlangıç x değerini bulmak -
def dx(fn, x, delta=0.001):
return (fn(x+delta) - fn(x))/delta
def solve(fn, value, x=0.5, maxtries=1000, maxerr=0.00001):
for tries in xrange(maxtries):
err = fn(x) - value
if abs(err) < maxerr:
return x
slope = dx(fn, x)
x -= err/slope
raise ValueError('no solution found')
potansiyel Burada birçok sorun vardır hesaplamalı doğruluk vb sınırlarını isabet Ancak bu durumda, hata minimizasyonu fonksiyonu uygundur ve biz iyi bir sonuç almak: Bu çözüm kesinlikle olmadığını
solve(my_func, 16) # returns (x =) 5.000000000000496
not, tam doğru. Mükemmel olmak için ihtiyacınız varsa veya analitik olarak denklemlerin ailelerini çözmeyi denemek istiyorsanız, daha karmaşık bir canavara dönmelisiniz: sembolik bir çözücü.
Mathematica veya Maple gibi sembolik bir çözücü, vb cebir, kalkülüs, ilgili yerleşik kurallar bir çok ("Bilgi") ile bir uzman sistemi anlamına gelir; Günahın türevinin, "kx^p" türevinin kpx^(p-1) ve benzeri olduğunu "bilir". Bir denklem verdiğinizde, bir yol bulmaya çalışır, bir kural-uygulama kümesi, nerede olursanız olun (denklem), nerede olursanız olun (denklemin en basit şekli, ki bu da umarım çözümdür). .
Örnek denkleminiz oldukça basittir; sembolik bir çözüm gibi görünebilir:
=> LHS([6, 2]) RHS([16])
# rule: pull all coefficients into LHS
LHS, RHS = [lh-rh for lh,rh in izip_longest(LHS, RHS, 0)], [0]
=> LHS([-10,2]) RHS([0])
# rule: solve first-degree poly
if RHS==[0] and len(LHS)==2:
LHS, RHS = [0,1], [-LHS[0]/LHS[1]]
=> LHS([0,1]) RHS([5])
ve çözüm yoktur: x = 5.
Bu fikrin lezzet verir umut; Uygulamanın detayları (iyi ve eksiksiz bir kurallar kümesinin bulunması ve her bir kuralın ne zaman uygulanması gerektiğine karar verilmesi) birçok insan-yıl çabalarını kolaylıkla tüketebilir.
4.5 saniyede 0 ila 60 yapan bir araba ister ve 45 MPG alır. Belki düz Python gereksinimini kaldırmayı düşünebilir ve harici kütüphaneleri kullanabilirsiniz –
Herhangi bir denklemi çözmek isterseniz kendi kütüphanenizi oluşturmanız gerekecektir. Ayrıca, bu örnek için 4,5 saniye yeterince hızlı değil: D – jamylak
Sorunlar her zaman x = yx için x = y = mx + c gibi görünecek mi? –