Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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 for loop用数值方法求解方程_Python_Algorithm_Numerical Methods - Fatal编程技术网

用Python for loop用数值方法求解方程

用Python for loop用数值方法求解方程,python,algorithm,numerical-methods,Python,Algorithm,Numerical Methods,我正在学习Python和概率 我已经给出了以下表达式: c = n! /((n-1)!1!) + 2*n! /((n-2)*2!) + 3*n!/((n-3)*3!) + ...+ n*n!/((n-n)*n! 其中0!=1和!表示“阶乘”,即n!=1*2*3*..*n-1*n。 等于: (a + n^b)*2^(c*n + d). (^ signifies exponent) 我的目标是使用“蛮力”确定参数a、b、c、d 我使用上述公式c计算n=312,n=438,n=580,n=619

我正在学习Python和概率

我已经给出了以下表达式:

c = n! /((n-1)!1!) + 2*n! /((n-2)*2!) + 3*n!/((n-3)*3!) + ...+ n*n!/((n-n)*n!
其中0!=1和!表示“阶乘”,即n!=1*2*3*..*n-1*n。 等于:

(a + n^b)*2^(c*n + d).  (^ signifies exponent)
我的目标是使用“蛮力”确定参数a、b、c、d

我使用上述公式c计算n=312,n=438,n=580,n=6192,n=7448

然后我将参数表示为两个整数的比率:即。 a=a1/a2,b=b1/b2,c=c1/c2,d=d1/d2

最后,我定义了以下函数:

def com():
    parms = []
    for a1 in range(-10, 10):
        for a2 in range(1,11):
            for b1 in range(-10,10):
                for b2 in range(1, 11):
                    for c1 in range(-10,10):
                        for c2 in range(1, 11):
                            for d1 in range(-10 , 10):
                                for d2 in range(1 , 11):
                                    a = a1/a2
                                    b = b1/b2
                                    c = c1/c2
                                    d = d1/d2
                                    cr1 = ( 12 == (a + 3**b)*2**(c*3+d) )
                                    cr2 = ( 38 == (a + 4**b)*2**(c*4+d) )
                                    cr3 = ( 80 == (a + 5**b)*2**(c*5+d) )
                                    cr4 = ( 192 == (a + 6**b)*2**(c*6+d) )
                                    cr5 = ( 448 == (a + 7**b)*2**(c*7+d) )
                                    criterion = cr1 & cr2 & cr3 & cr4 & cr5
                                    if criterion == 1 :
                                        parms = [a, b, c, d]
                                        break
    return parms
但是,我的函数返回一个空列表

你能解释一下吗?你对如何实现我的目标有什么建议吗

非常感谢您的建议。

首先,让我们看看代码中的一些错误: 这是对值执行位操作。你可能想要:

criterion = cr1 and cr2 and cr3 and cr4 and cr5
Python还提供了一个all函数,您可以检查所有内容是否正确:

现在,让我们看看您的if语句: 因为您想知道条件是真是假,所以只需使用if条件:

最后,这种方法不太可能是真的。以这一行为例: 这些数字加起来必须正好是12,否则它将是假的,然后你将得到一个空列表

而且 要求解实际值,必须使用参数替换。这不是一个编程问题,但数学和编程很好地结合在一起,所以这里有一个开始:

12 = (a + 3**b)*2**(c*3+d)
12/(a+3**b) = 2**(c*3+d)
。。。等等用b、c和d得到a,然后用你的cr2用a代替你的数字,用c和d得到b

再重复几次,就有了四个值的数字。

可以使用scipy curvefit和非线性最小二乘法将函数f拟合到数据中,并找到参数a、b、c、d值。您提供的示例数据更适合函数a+n**b+2**c*n+d。请注意,最适合a、b、c、d的值是浮点数,而不是整数

import numpy as np
from scipy.optimize import curve_fit

xdata = np.array(range(3,8))
ydata = np.array([12,38,80,192,448])

def func(n, a, b, c, d):
  return (a + n**b)+2**(c*n + d)

popt, pcov = curve_fit(func, xdata, ydata, p0=(1,1,1,1))
a, b, c, d = popt
print a, b, c, d # learnt parameters
# -5.62374782967 1.79345876905 1.29232902743 -0.328778229316

import matplotlib.pyplot as plt
plt.scatter(xdata, ydata)
plt.plot(xdata, func(xdata, a, b, c, d), '-r', label='np.poly')
plt.show()

在上面的拟合曲线中,蓝色点是数据点,红色线是带有学习参数的拟合函数,请注意,该函数是连续的,并且为所有n值定义,使用大脑而不是Python:

您可以识别修改后的二项式和,和k.Cnk,而不是和Cnk

然后注意

k.n!/(k!(n-k)!) = n!/((k-1)!(n-k)!) = n.(n-1)!/(k-1)!(n-1-k+1)!) = n.Cn-1,k+1.

因此,您的总和将为n.2^n-1。

在匆忙投入暴力之前,尝试估算参数的精确范围可能更明智

总和的第一个值是

1, 4, 12, 32, 80, 192, 448, 1024, 2304, 5120, 11264
以成对比率计算,你会发现它们越来越接近2

由于比率a+n+1^b/a+n^b将趋向于1,而比率2^cn+1+d/2^cn+d将趋向于2^c,因此提示c可能接近1。您可以通过尝试越来越大的n值来检查此估计值,例如,n=1000产生的比率为2.002002…=2^1.00144

然后,为了降低表达式的增长率,使其更易于处理,可以查看Sum/2^n的值,我们得到

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
哼,哼

不幸的是,这种情况对于正确演示该方法来说太容易了。一般的想法是观察渐近行为,以获得一些参数的粗略估计。当你在一个小范围内有这样一个粗略的估计,那么你可以通过某种方式取消它的影响,以便更好地看到其他的影响


对于详尽的搜索,了解范围很重要。

嵌套是极端的;签出iTerTools您尝试调试程序的是什么?你试过打印出a,b,c,d吗?是否有a、b、c、d的值产生非常接近12、38、80等的近似值。?为什么你认为在这个范围内有一个解决方案?仅供参考,你的a,b,c和d值将是整数,因此不包含你期望的值。如果我知道你在做什么。您可能希望将它们转换为浮动a=floata1/a2@bouletta不确定我是否正确理解了您的观点,但请注意,在Python 2中,如果a1=1和a2=2,则a=floata1/a2给出0.0。不确定OP使用的是哪个版本,但如果您希望它是一个float,则需要a=floata1/a2@roganjosh你完全正确。我写得太快了!你的说法当然是我的意思。好吧,这根本不能回答问题。
import numpy as np
from scipy.optimize import curve_fit

xdata = np.array(range(3,8))
ydata = np.array([12,38,80,192,448])

def func(n, a, b, c, d):
  return (a + n**b)+2**(c*n + d)

popt, pcov = curve_fit(func, xdata, ydata, p0=(1,1,1,1))
a, b, c, d = popt
print a, b, c, d # learnt parameters
# -5.62374782967 1.79345876905 1.29232902743 -0.328778229316

import matplotlib.pyplot as plt
plt.scatter(xdata, ydata)
plt.plot(xdata, func(xdata, a, b, c, d), '-r', label='np.poly')
plt.show()
k.n!/(k!(n-k)!) = n!/((k-1)!(n-k)!) = n.(n-1)!/(k-1)!(n-1-k+1)!) = n.Cn-1,k+1.
1, 4, 12, 32, 80, 192, 448, 1024, 2304, 5120, 11264
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11