Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/146.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_Numeric - Fatal编程技术网

我在用python数值求解非线性方程组时遇到了一个问题

我在用python数值求解非线性方程组时遇到了一个问题,python,numeric,Python,Numeric,我目前正试图用Python解决我的流体力学问题,这个问题产生了三个不同的方程。经过一些研究,我试图使它尽可能简单,结果产生了以下代码: from scipy.optimize import fsolve import math def equations(p): d, Re, f = p return (d**5 - 0.0165*f, 97200 - Re*d, f**(-0.5) + 2*math.log10(0.00015/(3.7*d) + 2.51/(Re*f**(

我目前正试图用Python解决我的流体力学问题,这个问题产生了三个不同的方程。经过一些研究,我试图使它尽可能简单,结果产生了以下代码:

from scipy.optimize import fsolve 
import math

def equations(p):
    d, Re, f = p
    return (d**5 - 0.0165*f, 97200 - Re*d, f**(-0.5) + 2*math.log10(0.00015/(3.7*d) + 2.51/(Re*f**(0.5))))
 
d, Re, f =  fsolve(equations, (0.22, 0.0213, 490000))

print(equations((d, Re, f)))
这会产生一个很长的错误:

> ValueError                                Traceback (most recent call
> last) <ipython-input-19-dcc7fc844bb6> in <module>()
>       6     return (d**5 - 0.0165*f, 97200 - Re*d, f**(-0.5) + 2*math.log10(0.00015/(3.7*d) + 2.51/(Re*f**(0.5))))
>       7 
> ----> 8 d, Re, f =  fsolve(equations, (0.22, 0.0213, 490000))
>       9 
>      10 print(equations((d, Re, f)))
> 
> ~\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in
> fsolve(func, x0, args, fprime, full_output, col_deriv, xtol, maxfev,
> band, epsfcn, factor, diag)
>     146                'diag': diag}
>     147 
> --> 148     res = _root_hybr(func, x0, args, jac=fprime, **options)
>     149     if full_output:
>     150         x = res['x']
> 
> ~\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in
> _root_hybr(func, x0, args, jac, col_deriv, xtol, maxfev, band, eps, factor, diag, **unknown_options)
>     225         with _MINPACK_LOCK:
>     226             retval = _minpack._hybrd(func, x0, args, 1, xtol, maxfev,
> --> 227                                      ml, mu, epsfcn, factor, diag)
>     228     else:
>     229         _check_func('fsolve', 'fprime', Dfun, x0, args, n, (n, n))
> 
> <ipython-input-19-dcc7fc844bb6> in equations(p)
>       4 def equations(p):
>       5     d, Re, f = p
> ----> 6     return (d**5 - 0.0165*f, 97200 - Re*d, f**(-0.5) + 2*math.log10(0.00015/(3.7*d) + 2.51/(Re*f**(0.5))))
>       7 
>       8 d, Re, f =  fsolve(equations, (0.22, 0.0213, 490000))
> 
> ValueError: math domain error
>ValueError回溯(最近的调用
>最后)在()
>6返回(d**5-0.0165*f,97200-Re*d,f**(-0.5)+2*math.log10(0.00015/(3.7*d)+2.51/(Re*f**(0.5)))
>       7 
>--->8d,Re,f=f解(方程式,(0.22,0.0213490000))
>       9 
>10打印(方程式((d,Re,f)))
> 
>中的~\Anaconda3\lib\site packages\scipy\optimize\minpack.py
>fsolve(func,x0,args,fpinite,full_输出,col_deriv,xtol,maxfev,
>波段,epsfcn,因子,诊断)
>146“diag”:diag}
>     147 
>-->148 res=\u root\u hybr(func、x0、args、jac=fprime,**选项)
>149如果满输出:
>150 x=分辨率['x']
> 
>中的~\Anaconda3\lib\site packages\scipy\optimize\minpack.py
>_root_hybr(func、x0、args、jac、col_deriv、xtol、maxfev、band、eps、factor、diag、**未知选项)
>225带_MINPACK_锁:
>226 retval=_minpack._hybrd(func,x0,args,1,xtol,maxfev,
>-->227 ml,mu,epsfcn,因子,诊断)
>228其他:
>229检查函数('fsolve','fprime',Dfun,x0,args,n,(n,n))
> 
>在方程(p)中
>4个def方程式(p):
>5d,Re,f=p
>--->6个返回值(d**5-0.0165*f,97200-Re*d,f**(-0.5)+2*math.log10(0.00015/(3.7*d)+2.51/(Re*f**(0.5)))
>       7 
>8d,Re,f=f解(方程式,(0.22,0.021349000))
> 
>ValueError:数学域错误
现在,我知道它一定与log value有关,但我认为等式的复杂性也可能在这里起作用。

您可以在
等式(p)
函数中添加
打印(d,Re,f)
,并查看值在每次迭代中的变化

我对它进行了一次运行,这些是出错前的结果

0.22 0.0213 490000.0
0.22 0.0213 490000.0
0.22 0.0213 490000.0
0.22000000327825547 0.0213 490000.0
0.22 0.02130000031739473 490000.0
0.22 0.0213 490000.007301569
4384243.368454826 -464.7214227491007 3096116.988633934
如您所见,在计算时,最后一行值实际上对
f**(-0.5)+2*数学无效。log10(0.00015/(3.7*d)+2.51/(Re*f**(0.5))
操作,因为
0.00015/(3.7*d)+2.51/(Re*f**(0.5))
计算结果为
-3.069524039032724e-06
,该值接近于0,因此被识别为0。因此,由于
log(0)
本身无效,因此它返回
域错误

若要解决此问题,您可能需要重新访问公式或扩展有效数字的数量,以容纳更多数字并阻止其为0。

您可以在
等式(p)
函数中添加
打印(d,Re,f)
,并查看值在每次迭代中的变化

我对它进行了一次运行,这些是出错前的结果

0.22 0.0213 490000.0
0.22 0.0213 490000.0
0.22 0.0213 490000.0
0.22000000327825547 0.0213 490000.0
0.22 0.02130000031739473 490000.0
0.22 0.0213 490000.007301569
4384243.368454826 -464.7214227491007 3096116.988633934
如您所见,在计算时,最后一行值实际上对
f**(-0.5)+2*数学无效。log10(0.00015/(3.7*d)+2.51/(Re*f**(0.5))
操作,因为
0.00015/(3.7*d)+2.51/(Re*f**(0.5))
计算结果为
-3.069524039032724e-06
,该值接近于0,因此被识别为0。因此,由于
log(0)
本身无效,因此它返回
域错误


要解决此问题,您可能需要重新访问公式或扩展有效数字的数量,以容纳更多数字,并阻止其为0。

这是因为您在log函数中获得了-ve值,但我没有;我没有必要的领域知识来解决它,因为你在日志函数中得到了-ve值,但是我没有;我没有必要的领域知识来解决它