Python 用scipy'求解方程;斯夫索尔夫酒店
我试图解方程Python 用scipy'求解方程;斯夫索尔夫酒店,python,scipy,nonlinear-functions,Python,Scipy,Nonlinear Functions,我试图解方程f(x)=x-sin(x)-n*t-m0 在这个等式中,n和m0是在我的类中定义的属性。此外,t是等式中的一个常量整数,但每次都必须改变 我已经解了这个方程,所以我得到了一个“新方程”。我已经导入了scipy.optimize def f(x, self): return (x - math.sin(x) -self.M0 - self.n*t) def test(self,t): return fsolve(self.f, 1, args=(t)) 有什么修正和
f(x)=x-sin(x)-n*t-m0
在这个等式中,n
和m0
是在我的类中定义的属性。此外,t
是等式中的一个常量整数,但每次都必须改变
我已经解了这个方程,所以我得到了一个“新方程”。我已经导入了scipy.optimize
def f(x, self):
return (x - math.sin(x) -self.M0 - self.n*t)
def test(self,t):
return fsolve(self.f, 1, args=(t))
有什么修正和建议可以让它工作吗?您正在使用某种根查找算法。有几种常用的,所以知道哪一种会有帮助 你需要知道三件事:
将感兴趣的功能可视化可能会有所帮助。你有两个:一个线性函数和一个正弦波。如果要绘制这两个曲线,哪些常数集会给出交点?交叉点是您正在寻找的根。您正在使用某种类型的根查找算法。有几种常用的,所以知道哪一种会有帮助 你需要知道三件事:
将感兴趣的功能可视化可能会有所帮助。你有两个:一个线性函数和一个正弦波。如果要绘制这两个曲线,哪些常数集会给出交点?交叉点是您要查找的根。我至少可以看到两个问题:您混淆了
f
的参数顺序,并且您没有授予f
访问t
的权限。像这样的方法应该会奏效:
import math
from scipy.optimize import fsolve
class Fred(object):
M0 = 5.0
n = 5
def f(self, x, t):
return (x - math.sin(x) -self.M0 - self.n*t)
def test(self, t):
return fsolve(self.f, 1, args=(t))
[请注意,我很懒,成为了M0
和n
类成员]
其中:
>>> fred = Fred()
>>> fred.test(10)
array([ 54.25204733])
>>> import numpy
>>> [fred.f(x, 10) for x in numpy.linspace(54, 55, 10)]
[-0.44121095114838482, -0.24158955381855662, -0.049951288133726734,
0.13271070588400136, 0.30551399241764443, 0.46769772292130796,
0.61863201965219616, 0.75782574394219182, 0.88493255340251409,
0.99975517335862207]
我至少可以看到两个问题:您混淆了
f
的参数顺序,并且您没有授予f
访问t
的权限。像这样的方法应该会奏效:
import math
from scipy.optimize import fsolve
class Fred(object):
M0 = 5.0
n = 5
def f(self, x, t):
return (x - math.sin(x) -self.M0 - self.n*t)
def test(self, t):
return fsolve(self.f, 1, args=(t))
[请注意,我很懒,成为了M0
和n
类成员]
其中:
>>> fred = Fred()
>>> fred.test(10)
array([ 54.25204733])
>>> import numpy
>>> [fred.f(x, 10) for x in numpy.linspace(54, 55, 10)]
[-0.44121095114838482, -0.24158955381855662, -0.049951288133726734,
0.13271070588400136, 0.30551399241764443, 0.46769772292130796,
0.61863201965219616, 0.75782574394219182, 0.88493255340251409,
0.99975517335862207]
您需要这样定义f()
:
def f(self, x, t):
return (x - math.sin(x) - self.M0 - self.n * t)
换言之:
self
是第一位的(它总是这样)李>
x的当前值
李>
fsolve()
的参数f()
:
def f(self, x, t):
return (x - math.sin(x) - self.M0 - self.n * t)
换言之:
self
是第一位的(它总是这样)李>
x的当前值
李>
fsolve()
的参数你能给我们一个完整的例子,包括这个“不起作用”的例子吗?我想我以前从未见过
f(x,self)
。。第一个参数将获得实例,不管您如何称呼它。它是使用scipy.optimize中的fsolve实现的。主要问题是它必须在类中完成。这就是为什么我需要在f(x,self)中定义方程的原因。我需要消除的第一个错误是TypeError:func()正好有2个参数(给定3个),所以它可能与args=(t)有关,因为在我添加之前,它没有给出那个错误。你能给我们一个完整的例子,包括这个“不起作用”吗?我想我以前从未见过f(x,self)
。。第一个参数将获得实例,不管您如何称呼它。它是使用scipy.optimize中的fsolve实现的。主要问题是它必须在类中完成。这就是为什么我需要在f(x,self)中定义方程的原因。我需要消除的第一个错误是TypeError:func()正好需要2个参数(给定3个),所以它可能与args=(t)有关,因为在我添加之前,它没有给出错误。主要问题是它必须在类中完成。这就是为什么我需要定义f(x,self)中的方程,主要问题是它必须在一个类中完成。这就是为什么我需要定义f(x,self)中的方程。