Как решить уравнение, используя sympy? - PullRequest
1 голос
/ 25 мая 2019

Мне нужно написать код для решения уравнения модели МакЛахлана. найти значение для c после замены другими параметрами (x и h) из циклов for как это сделать ??!

У меня есть код, написанный на matlab, который делает то, что мне нужно ... но та же идея не работает для python, я получаю ошибки !!

Traceback (most recent call last):
  File "func.py", line 18, in <module>
    (x * f ** (1 / h) - x * c ** (1 / h))
NameError: name 'c' is not defined

вот мой код на python

import numpy
from sympy import Symbol, solve

v_p = input("Enter perculion threshold:")
sigma_P = input("Enter MOFs conductivity:")
sigma_F = input("Enter filler conductivity:")

p = float(sigma_P)
f = float(sigma_F)

x = Symbol('c')
A = (1 - float(v_p) / float(v_p))

for h in numpy.arange(1, 1.5, 0.1):
   for x in numpy.arange(0, 1, 0.1):
       print(solve([
           (
                   (x * f ** (1 / h) - x * c ** (1 / h))
                   /
                   (f ** (1 / h) + A * c ** (1 / h))
           )
           /
           (
                   (p ** (1 / h) - c ** (1 / h) - x * p ** (1 / h) + x * c ** (1 / h))
                   /
                   (p ** (1 / h) + A * c ** (1 / h))
           )
       ], [c]))

и это код, написанный в Matlab

syms sigma_c
A=4.777
sigma_f = 550
sigma_p = 1.7 * 10 ^ (-11)

for h = 2:10
    for j = 1:10
        v_f = 0.1 * j;
        ans = solve([(((v_f) * (((sigma_f) ^ (1 / h)) - ((sigma_c) ^ (1 / h))))/(((sigma_f) ^ (1 / h)) + ((A) * ((sigma_c) ^ (1 / h))))) + (((1 - v_f) * (((sigma_p) ^ (1 / h)) - ((sigma_c) ^ (1 / h))))/(((sigma_p) ^ (1 / h)) + ((A) * ((sigma_c) ^ (1 / h))))) == 0], [sigma_c]);
        answer = double(ans)
        arr(h,j) = answer;
        end
end

disp(arr)

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Вы получаете «SyntaxError: неверный синтаксис», потому что не все скобки закрыты. Код ниже предлагает форматирование, чтобы дать больше обзора в вычислениях. Я ожидаю, что ')' должно быть добавлено в строку 25, однако это, очевидно, неоднозначно, и вы должны проверить это с вашей собственной идеей.

Обратите внимание, что 'c' все еще не определено, ваш код не будет работать без него.

import numpy
from sympy import Symbol, solve

v_p = input("Enter perculion threshold:")
sigma_P = input("Enter MOFs conductivity:")
sigma_F = input("Enter filler conductivity:")

p = float(sigma_P)
f = float(sigma_F)

x = Symbol('c')
A = (1 - float(v_p) / float(v_p))

for h in numpy.arange(1, 1.5, 0.1):
    for x in numpy.arange(0, 1, 0.1):
        print(solve([
            (
                    (x * f ** (1 / h) - x * c ** (1 / h))
                    /
                    (f ** (1 / h) + A * c ** (1 / h))
            )
            /
            (
                    (p ** (1 / h) - c ** (1 / h) - x * p ** (1 / h) + x * c ** (1 / h))
                    /
                    (p ** (1 / h) + A * c ** (1 / h))
            )
        ], [c]))
0 голосов
/ 25 мая 2019

SymPy может сильно помочь с символической частью.Если вы скопируете и вставите свое рабочее уравнение, а затем замените его символами, которые вы пытаетесь использовать в версии Python, вы получите выражение, которое отличается от того, которое вы ввели в версии Python:

>>> eq2=S('''(((v_f) * (((sigma_f) ^ (1 / h)) - ((sigma_c) ^ (1 / h)))
)/(((sigma_f) ^ (1 / h)) + ((A) * ((sigma_c) ^ (1 / h))))) + ((
(1 - v_f) * (((sigma_p) ^ (1 / h)) - ((sigma_c) ^ (1 / h))))/((
(sigma_p) ^ (1 / h)) + ((A) * ((sigma_c) ^ (1 / h)))))'''.replace('^','**'))
>>> eq2 = eq2.subs(
'v_f','x').subs(
'sigma_f','f').subs(
'sigma_c','c').subs(
'sigma_p','p')
>>> factor_terms(eq2)
x*(-c**(1/h) + f**(1/h))/(A*c**(1/h) + f**(1/h)) + (1 - x)*(-c**(1/h) + p**(1/h))/(
A*c**(1/h) + p**(1/h))

Но хорошая новость заключается в том, что любое уравнение может быть решено символически для c**(1/h), поскольку оно является квадратичным в этом выражении, поэтому вы можете подставить значения для x и h в решения после их вычисления.Удобный способ сделать это, например, это

>>> soln = Tuple(*solve(x**2 - y, x))
>>> for yi in (2, 3):
...    print(soln.subs(y, yi).n())  # the .n() to evaluate the values
...