解决Python中的隐式方程

3

我想编写一段代码,用相对误差%1来解决下面方程中的“y”:

enter image description here

在这个方程中,我们有“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
@jlandercy,谢谢。我不了解牛顿法。 - Etemon
@flabons的答案利用了scipy中实现的它。 - jlandercy
1个回答

5

您可以通过如下定义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开关向其传递参数,而不是使用全局变量,那将是非常好的。 - jlandercy
谢谢,我写了代码但输出结果是:[7.64530883] [-3.55271368e-14] 但y的答案应该是1.846。 - Etemon
我按照@jlandercy的建议添加了函数参数。使用给定的参数,解决方案应该确实是y0约为7.64。如果您绘制函数,就会看到这一点。对于某些函数,您可能会根据fsolve的起始值获得不同的解决方案,但这仅适用于具有多个局部最小值的函数,在此情况下您没有这种情况。 - flabons
@dgf 有任何打字错误或设置不当吗?我们已经通过三种不同的方式确认了根目录。 - jlandercy
@jlandercy 这些值只是默认值,你可以随意使用参数元组调用 fslove。 - flabons
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接