Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';难道我不能用Python集中解决方案吗?_Python_Sympy_Derivative - Fatal编程技术网

为什么可以';难道我不能用Python集中解决方案吗?

为什么可以';难道我不能用Python集中解决方案吗?,python,sympy,derivative,Python,Sympy,Derivative,我有一个方程,我想找到这个方程的导数等于1的地方 我使用sympy的解并从方程中减去1来解0,但它永远不会收敛于一个解,在这种情况下,对于f'(x)=1,该解应该是x=260.806 为什么它找不到这个解决方案?如果不重写sympy以外的东西,我能改变什么?它不会抛出错误,只是无限期地尝试 import sympy as sym from sympy import symbol, symbols, solve, init_printing, diff, lambdify, exp import

我有一个方程,我想找到这个方程的导数等于1的地方

我使用sympy的解并从方程中减去1来解0,但它永远不会收敛于一个解,在这种情况下,对于f'(x)=1,该解应该是x=260.806

为什么它找不到这个解决方案?如果不重写sympy以外的东西,我能改变什么?它不会抛出错误,只是无限期地尝试

import sympy as sym
from sympy import symbol, symbols, solve, init_printing, diff, lambdify, exp
import matplotlib.pyplot as plt
import numpy as np

x_sym = symbols('x')
init_printing(use_unicode=True)
y_sym_orig = x_sym*exp(0.4*(1-x_sym/550))
y_sym_deriv = diff(y_sym_orig, x_sym, 1)
print('Orig=', y_sym_orig)
print('Deriv=', y_sym_deriv)

y_orig = sym.lambdify(x_sym, y_sym_orig)
y_deriv = sym.lambdify(x_sym, y_sym_deriv)

x_sol=solve(y_sym_deriv-1, x_sym)
print('The derivative has y=1 at: ',x_sol)

plt.figure()
x1 = np.arange(0, 300, .1)
y_graph = y_orig(x1)
y_deriv = y_deriv(x1)
plt.ylabel('y')
plt.xlabel('x')
plt.grid(True, which='both')
plt.ylim(0,1)
plt.plot(x1, y_graph, 'r', label='Original')
plt.plot(x1, y_deriv, 'b', label='Derivitive')
plt.title('Original and Derivitives')
plt.legend()
plt.show()

SymPy强烈喜欢有理数而不是浮点数。从Symphy import Rational添加
,并将
0.4
替换为公式中的
Rational('0.4')

y_sym_orig = x_sym*exp(Rational('0.4')*(1-x_sym/550))
y_sym_deriv = diff(y_sym_orig, x_sym, 1)
x_sol = solve(y_sym_deriv-1, x_sym)
print('The derivative has y=1 at: ', x_sol)
印刷品

The derivative has y=1 at:  [-1375*LambertW(exp(3/5)) + 1375]
注:

  • Rational(2,5)
    是在SymPy中表示2/5的另一种方式
    Rational(0.4)
    Rational(2/5)
    没有帮助:两个版本都首先创建Python浮点,其Rational形式不是2/5,而是3602879701896397/9007199254740992

  • 在解方程之前把它打印出来(就像你做的那样)是个好主意。这里导数的公式是原始形式的
    -0.00108496341646638*x*exp(-0.00072727*x)+1.49182469764127*exp(-0.00072727*x)
    -x*exp(-x/1375+2/5)/1375+exp(-x/1375+2/5)
    。考虑到浮点算法与符号数学规则的不同,当方程中充满了浮点数时,以符号方式求解方程是一项艰巨或不可能的任务

  • 更多信息,请参阅

拿出调试器,用断点找到答案谢谢!这非常有帮助。关于你的解决方案有两个问题。在这之前有没有一段代码可以告诉SymPy总是理性地处理它们?另外,是否有一种方法可以输出数值而不是LambertW简化形式?在打印时使用N(x_sol[0],6)而不是x_sol解决了后一个问题。我仍然有前一个关于默认使用rational的问题,这样我就可以在不必每次添加rational的情况下即插即用方程了,如果你知道的话,但我也会继续研究这个问题。不,没有一个标志可以做到这一点。一旦创建了类似于0.4的Python浮点,Symphy就会看到它是什么样子:3602879701896397/9007199254740992(以分数形式)。它并没有试图猜测这个数字是用来表示2/5的。如果你只是想要一个数值解,SymPy已经为这个做了准备。(而且SciPy有更强大的数值解算器。)要求符号解,然后将其转换为数值解通常是不切实际的。