当前位置: 首页 > 知识库问答 >
问题:

用python求解非线性超定系统

龚威
2023-03-14

我正试图找到一个用Python解决一个非线性超定系统的好方法。我在这里查看了优化工具http://docs.cipy.org/doc/scipy/reference/optimize.nonlin.html,但我不知道如何使用它们。到目前为止我所掌握的是

#overdetermined nonlinear system that I'll be using
'''
a = cos(x)*cos(y)                           
b = cos(x)*sin(y)                           
c = -sin(y)                                   
d = sin(z)*sin(y)*sin(x) + cos(z)*cos(y)    
e = cos(x)*sin(z)                           
f = cos(z)*sin(x)*cos(z) + sin(z)*sin(x)    
g = cos(z)*sin(x)*sin(y) - sin(z)*cos(y)    
h = cos(x)*cos(z)
a-h will be random int values in the range 0-10 inclusive
'''
import math
from random import randint
import scipy.optimize

def system(p):
    x, y, z = p
    return(math.cos(x)*math.cos(y)-randint(0,10),
           math.cos(x)*math.sin(y)-randint(0,10),
           -math.sin(y)-randint(0,10),
           math.sin(z)*math.sin(y)*math.sin(x)+math.cos(z)*math.cos(y)-randint(0,10),
           math.cos(x)*math.sin(z)-randint(0,10),
           math.cos(z)*math.sin(x)*math.cos(z)+math.sin(z)*math.sin(x)-randint(0,10),
           math.cos(z)*math.sin(x)*math.sin(y)-math.sin(z)*math.cos(y)-randint(0,10),
           math.cos(x)*math.cos(z)-randint(0,10))

x = scipy.optimize.broyden1(system, [1,1,1], f_tol=1e-14)

你能帮我一下吗?

共有1个答案

仲孙凡
2023-03-14

如果我没理解错的话,你想找到非线性方程组f(x)=b的近似解,其中b是包含随机值b=[a,...,h]的向量。

为此,您首先需要从system函数中删除随机值,否则在每次迭代中,求解器将尝试求解不同的方程组。而且,我认为基本的Broyden方法只对一个未知量和方程一样多的系统起作用。或者,您可以使用scipy.optimize.leastsq。一个可能的解决方案如下所示:

# I am using numpy because it's more convenient for the generation of
# random numbers.
import numpy as np
from numpy.random import randint
import scipy.optimize

# Removed random right-hand side values and changed nomenclature a bit.
def f(x):
    x1, x2, x3 = x
    return np.asarray((math.cos(x1)*math.cos(x2),
                       math.cos(x1)*math.sin(x2),
                       -math.sin(x2),
                       math.sin(x3)*math.sin(x2)*math.sin(x1)+math.cos(x3)*math.cos(x2),
                       math.cos(x1)*math.sin(x3),
                       math.cos(x3)*math.sin(x1)*math.cos(x3)+math.sin(x3)*math.sin(x1),
                       math.cos(x3)*math.sin(x1)*math.sin(x2)-math.sin(x3)*math.cos(x2),
                       math.cos(x1)*math.cos(x3)))

# The second parameter is used to set the solution vector using the args
# argument of leastsq.
def system(x,b):
    return (f(x)-b)

b = randint(0, 10, size=8)
x = scipy.optimize.leastsq(system, np.asarray((1,1,1)), args=b)[0]

我希望这对你有帮助。但是,请注意,您找到解决方案的可能性极小,特别是当您在区间[0,10]中生成随机整数,而f的范围被限制在[-2,2]时

 类似资料:
  • 问题内容: 我有三个未知数4非线性方程,和我想要解决。等式的形式为: …其中,和是取决于四个方程式中每个值的常数。 解决此问题的最佳方法是什么? 问题答案: 有两种方法可以做到这一点。 使用非线性求解器 线性化问题并以最小二乘法解决 设定 因此,据我所知,您知道在4个不同点处的F,a,b和c,并且想要对模型参数X,Y和Z求逆。我们有3个未知数和4个观测数据点,因此这个问题太确定了。因此,我们将在最

  • 我正在研究一个非线性微分方程求解器。我能得到一般的解决方案,但不能得到具体的解决方案。当我试图找到集成常量时,我得到了错误:E_x不可调用的,我的解决方案被归类为一个列表,所以我不能在其中替换任何东西。 这是我的代码: 我在上得到了可调用错误,在我在书中的例子(数值Python)解决了一个线性ODE,但没有得到这个错误。有没有一种不同的方法来解决非线性DE,或者将E定义为可调用的,而将E_sol定

  • 介绍 非确定性是一种通过仅定义问题来解决问题的算法。非确定性程序自动选择符合条件的选项。这项技术很适合逻辑编程。 例如,以下代码返回一对数,其和是一个质数。其中一个数从'(4 6 7)选取,另一个从'(5 8 11)选取。 (let ((i (amb 4 6 7)) (j (amb 5 8 11))) (if (prime? (+ i j)) (list i j)

  • 我正在用pyomo编程求解非线性优化问题(使用ipopt求解器)。稍后,我想在模型中添加随机元素。我知道在Pyomo中,可以使用复数形式来处理随机规划,但复数形式只能处理线性规划、混合整数规划和二次规划。 一般非线性随机规划问题有求解器吗?如果没有,我们如何使用现有的求解器来处理它?

  • 在形式语言的乔姆斯基分类中,我需要一些非线性、无歧义和非确定性上下文自由语言(N-CFL)的例子? > 线性语言:线性语法是可能的(⊆ 例如 L1={anbn|n≥ 0 } 确定性上下文自由语言(D-CFG):可以使用确定性推下自动机(D-PDA),例如 L2={anbncm|n≥0,m≥0} L2是明确的。 非线性的CF语法是非线性的 Lnl={w:na(w)=nb(w)}也是一个非线性CFG。

  • 我试图用Scipy的fsolve找到两个非线性方程组的答案。这两个方程是: 在这种情况下,和是常量。基本目标是找到同时满足和的,。我知道,的初始猜测是和。下面是我的代码。 当我执行代码时,我总是遇到数学域错误。但是,如果我尝试使用MAPLE解决它。我可以得到答案。 通过将这些插入方程,我得到,这表明答案是正确的。我不知道如何让西皮解决问题。任何建议将不胜感激。