Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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_Numerical Analysis_Bisection - Fatal编程技术网

Python 用二分法求解方程

Python 用二分法求解方程,python,numerical-analysis,bisection,Python,Numerical Analysis,Bisection,我可以在网上找到专门针对python的二分法吗 例如,给定这些方程,我如何使用二分法求解它们 x^3 = 9 3 * x^3 + x^2 = x + 5 cos^2x + 6 = x 使用: 导入scipy.optimize作为优化 将numpy作为np导入 def func(x): 返回np.cos(x)**2+6-x #这对你有帮助 import numpy as np def fn(x): # This the equation to find the root

我可以在网上找到专门针对python的二分法吗

例如,给定这些方程,我如何使用二分法求解它们

x^3 = 9  
3 * x^3 + x^2 = x + 5  
cos^2x + 6 = x  
使用:

导入scipy.optimize作为优化
将numpy作为np导入
def func(x):
返回np.cos(x)**2+6-x
#这对你有帮助

import numpy as np

def fn(x):
    # This the equation to find the root
    return (x**3 - x - 1) #x**2 - x - 1

def find_root_interval():
    for x in range(0, 1000):
        if fn(x) < 0:
            lower_interval = x
            if fn(x+1) > 0:
                higher_interval = x + 1
                return lower_interval, higher_interval
    return False

def bisection():
    a,b = find_root_interval()
    print("Interval: [{},{}]".format(a,b))
    # Create a 1000 equally spaced values between interval
    mid = 0
    while True:
        prev_mid = mid
        mid = (a+b)/2
        print("Mid value: "+str(mid))
        # 0.0005 is set as the error range
        if abs(mid-prev_mid) < 0.0005:
            return mid
        elif fn(mid) > 0:
            b = mid
        else:
            a = mid

root = bisection()
print(root)
将numpy导入为np
def fn(x):
#这是求根的方程式
返回(x**3-x-1)#x**2-x-1
def find_root_interval():
对于范围(0,1000)内的x:
如果fn(x)<0:
下限间隔=x
如果fn(x+1)>0:
较高的_间隔=x+1
返回较低的\u间隔,较高的\u间隔
返回错误
def二分法():
a、 b=查找根间隔()
打印(“间隔:[{},{}].”格式(a,b))
#在间隔之间创建1000个等距值
mid=0
尽管如此:
prev_mid=mid
中期=(a+b)/2
打印(“中间值:+str(中间))
#0.0005设置为误差范围
如果abs(中-上/中)<0.0005:
中途返回
elif fn(mid)>0:
b=中等
其他:
a=中等
根=二等分()
打印(根)

如何获取a和b值?还有循环的数量?就像在这个例子中,它试图解这个方程(x^3+4x^2-10=0),它使用函数对分[1,2,30],如何得到数字12和30?这是从方程中得到的吗?@bn:要使用对分,你必须提供
a
b
,使得
func(a)
func(b)
具有相反的符号,从而保证
[a,b]
中有根,因为
func
必须是连续的。您可以尝试猜测
a
b
的值,使用一些分析,或者如果您想以编程方式进行分析,您可以设计一些方法来生成候选
a
b
,直到找到两个符号相反的值。然而,这一切都超出了简单的
bisect
方法的范围。@bn:关于迭代次数,
scipy.optimize.bisect
有一个
maxiter
参数。例如,
so.bisect(func,6,8,maxiter=500)
。再见。@unutbu,谢谢!对于(方程式x^3=9),我尝试了a的值为0,b的值为1000(2.10571289062)。它给了我不同的答案,a为0,b为5(2.0802307129)。根据wolfram的说法,这2.0802307129是答案^3+%3D+9++我希望我的数值方法课程使用Python。:/这对你自己的实施很有指导意义;请阅读维基百科对算法的描述。最好使用一些已经被很多人使用过的东西,而不是自己编写。
import numpy as np

def fn(x):
    # This the equation to find the root
    return (x**3 - x - 1) #x**2 - x - 1

def find_root_interval():
    for x in range(0, 1000):
        if fn(x) < 0:
            lower_interval = x
            if fn(x+1) > 0:
                higher_interval = x + 1
                return lower_interval, higher_interval
    return False

def bisection():
    a,b = find_root_interval()
    print("Interval: [{},{}]".format(a,b))
    # Create a 1000 equally spaced values between interval
    mid = 0
    while True:
        prev_mid = mid
        mid = (a+b)/2
        print("Mid value: "+str(mid))
        # 0.0005 is set as the error range
        if abs(mid-prev_mid) < 0.0005:
            return mid
        elif fn(mid) > 0:
            b = mid
        else:
            a = mid

root = bisection()
print(root)