【问题标题】:Solve an implicit equation Python求解隐式方程 Python
【发布时间】:2020-10-17 08:49:15
【问题描述】:

我想编写一个代码来解决下面等式中相对误差为 %1 的“y”:

在等式中,我们有“b=2, x=1, n=0.015, S_0=0.002, Q=21”的值,并且应该计算 y。

我写了这段代码:

b=float(input('b='))
x=float(input('x= '))
n=float(input('n= '))
s=float(input('S_0= '))
Q=float(input('Q= '))
Q=(1/n)*((y*(b+x*y))**(5/3))/((b+2*y*(1+x**2)**(1/2))**(2/3)))*s
print(y)

它不起作用。

我不熟悉如何在 python 中求解隐式方程。如果不是隐含的,我可以写出关于 y 的方程,然后写输入。但是在这里我不知道该怎么办。

【问题讨论】:

  • 欢迎来到SO,如果你必须用数值​​方法手工求解它来近似它,你会怎么做?你知道牛顿法吗?
  • @jlandercy,谢谢。我不知道牛顿法。
  • 下面@flabons 的回答利用了scipy中实现的它

标签: python equation


【解决方案1】:

您可以通过定义如下 f(y) 来重新表述您的方程,然后使用 fsolve 找到它的根

from scipy.optimize import fsolve
def f(y,b=2,x=1,n=0.015,S_0=0.002,Q=21):
    return (1/n)*((y*(b+x*y))**(5/3))/((b+2*y*(1+x**2)**(1/2))**(2/3))*S_0-Q
a=fsolve(f,1)
print(a)
print(f(a))

【讨论】:

  • 如果您将f 参数化并使用args 开关而不是使用全局变量将参数传递给它,那就太好了。
  • 谢谢,我写了代码,但它给出了输出:[7.64530883] [-3.55271368e-14] 但是y的答案应该是1.846
  • 我遵循@jlandercy 的建议并将参数添加到函数中。并且使用给定的参数,解决方案确实应该是 y0 大约 7.64。如果您绘制函数,您会看到它。对于某些函数,根据 fsolve 的起始值,您可能会得到不同的解决方案,但这仅适用于具有多个局部最小值的函数,在这种情况下您没有。
  • OP 所述的方程有three roots,两个共轭复数和一个实数,如您所见,约为 7.64。
  • 您参数化的问题是您不能将它与 fsolve 一起使用。它应该是 args 而不是 kwargs:签名是 equation(y, x, b, S0, n, Q0),然后调用 fsolve 是 fsolve(equation, 0.1, args=(1, 2, 0.002, 0.015, 21)) 然后你可以解决多个系统而无需重写任何代码,只需传递正确的参数元组。干杯
猜你喜欢
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多