如何用python求解非线性方程组

2024-10-01 17:25:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

#!/usr/bin/env python
from scipy.optimize import fsolve
import math

h = 6.634e-27
k = 1.38e-16

freq1 = 88633.9360e6
freq2 = 88631.8473e6
freq3 = 88630.4157e6

def J(freq,T):
     return (h*freq/k)/(math.exp(h*freq/(k*T))-1)

def equations(x,y,z,w,a,b,c,d):
     f1 = a*(J(freq1,y)-J(freq1,2.73))*(1-math.exp(-a*z))-(J(freq2,x)-J(freq2,2.73))*(1-math.exp(-z))
     f2 = b*(J(freq3,w)-J(freq3,2.73))*(1-math.exp(-b*z))-(J(freq2,x)-J(freq2,2.73))*(1-math.exp(-z))
     f3 = c*(J(freq3,w)-J(freq3,2.73))*(1-math.exp(-b*z))-(J(freq1,y)-J(freq1,2.73))*(1-math.exp(-a*z))
     f4 = d*(J((freq3+freq1)/2,(y+w)/2)-J((freq3+freq1)/2,2.73))-(J(freq2,x)-J(freq2,2.73))*(1-math.exp(-z))
     return (f1,f2,f3,f4)

所以,我已经在上面的代码中定义了方程。4个非线性方程组包括4个变量,a->;d,它们是预先确定的,4个未知的,x,y,z和w。我想以某种方式定义a->;d并将它们输入到fsolve中,从而为x、y、z和w创建唯一的解。这可能吗?在


Tags: 代码importreturndefmathf2f1freq
1条回答
网友
1楼 · 发布于 2024-10-01 17:25:45

我没有得到你得到的x is not defined错误,但这可能是在命令行出错。这可以很容易地在脚本中完成,但是没有任何更改。在

Scipy的fsolve接受一个可调用函数作为输入。例如,如果你想求解f1,你可以这样做:

def f1(x, y, z, a):
    return a*(J(freq1,y)-J(freq1,2.73))*(1-math.exp(-a*z))-(J(freq2,x)-J(freq2,2.73))*(1-math.exp(-z))

root = fsolve(f1, x0=1, args=(1, 1, 1))

这就解决了x的f1(x,y,z,a)=0,y,z和a作为附加参数(在本例中为1)。因此,根据要求解的变量,它应该首先出现在参数顺序中,例如,求解a需要f1(a,x,y,z)。x0是根的起始估计值。在

然后返回一个带有根的ndarray。在

有关详细信息,请查看http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html

更新: 看看How to solve a pair of nonlinear equations using Python?的答案

要求解x、y、z和w的所有值,需要将它们作为单个参数传递。所以你最终会得到这样的结果:

^{pr2}$

相关问题 更多 >

    热门问题