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

弗索尔夫给出了奇怪的答案

卫鸿朗
2023-03-14

我想用fsolve数值求解一个非线性超越方程的根。

下面的代码执行此任务。

import numpy as np
from scipy.optimize import fsolve
import matplotlib.pyplot as plt

kappa=0.1 tau=90

def方程(x,*参数): kappa, tau=参数 返回-x kappa*np.sin(-tau*x)

我可以通过绘制两个图f1(x)=x和f2(x)=k*sin(-x*tau),以图形方式再次检查解决方案,这两个图我也包含在代码中

问题是,我想自动化改变kappa和tau的过程,而不检查哪些答案是错误的,哪些是正确的。但是错误的答案作为输出,我不能使用这种方法。为了安全起见,还有其他方法或选择吗?

谢谢你的帮助。

共有1个答案

慕飞章
2023-03-14

根据scipy上的文档,我无法运行您的代码,出现了错误,而且无论如何。fsolve,您应该添加一个初始猜测作为第二个输入参数,而不是像您在那里所做的那样的范围fsolve(方程式,x0,(kappa,tau))

当然,您可以在循环中传递它,为数组np中的每个值循环。linspace(0.5,0.5,25)。虽然我不明白你想通过改变kappa和tau来实现什么,但是如果我认为对于那些给定的参数,你有兴趣寻找根,下面是我将如何做到的。

import numpy as np
from scipy.optimize import fsolve
import matplotlib.pyplot as plt

# Take it as it is
kappa   = 0.1
tau     = 90

def equation(x, parameters):
    kappa,tau = parameters
    return -x + kappa * np.sin(-tau*x)

# Initial guess of x = -0.1
SolutionStack   = []
x0              = -kappa
y               = fsolve(equation, x0, [kappa, tau])
SolutionStack.append(y[0])

y               = fsolve(equation, SolutionStack[-1], [kappa, tau])
SolutionStack.append(y[0])
deltaY = SolutionStack[-1] - SolutionStack[0]

# Define tolerance
tol = 5e-4
while ((SolutionStack[-1] <= kappa) and (deltaY <= tol)):
    y = fsolve(equation, SolutionStack[-1], [kappa, tau])
    SolutionStack.append(y[0])
    deltaY = SolutionStack[-1] - SolutionStack[-2]
    # Obviously a little guesswork is involved here, as it pertains to 0.07
    if deltaY <= tol:
        SolutionStack[-1] = SolutionStack[-1] + 0.07

# Obtaining the roots
Roots = []
Roots.append(SolutionStack[0])
for i in range(len(SolutionStack)-1):
    if (SolutionStack[i+1] - SolutionStack[i]) <= tol:
        continue
    else:
        Roots.append(SolutionStack[i+1]

也许这不是最聪明的方法(假设我对你的理解是正确的),但也许你现在有了一个想法。

 类似资料:
  • 问题内容: 这段代码: 调用此方法: 给我一个ClassCastException->跟踪的一部分: 这很奇怪,因为,实际上,如果您查找Hibernate的源代码,它将尝试执行以下操作: 这没有任何意义… 目标的类型为Class,此代码尝试将其强制转换为Map, 为什么要尝试这样做??? 任何指针都值得欢迎… 我正在使用Hibernate 5(并且正在从3升级)… 编辑:我也使用Spring(4.

  • 问题内容: 我正在尝试在节点中使用Express,安装一切正常,进行编译,获取npm并通过以下方式安装express: npm安装快递 问题是,每次我尝试“要求”它时,都会给我一个错误!看一下一个简单的文件app.js: 当我运行它时: 有人能帮我吗?为什么会出现此错误?如何安装与Express不同的版本? 问题答案: 问题是,你可能有最新的连接(而不是“您需要安装最新的连接”)的命令@Shrip

  • 问题内容: 因此,当我在Java中使用Doubles进行加法或减法时,它会给我带来奇怪的结果。这里有一些: 如果我加上,它给了我。没错 如果我添加,它会给我(重复s 的数量可能会关闭)。错了 如果我减去,它就会给我(再次,重复的s可能会关闭)。错了 起初我以为这只是将双精度数与十进制值相加的问题,但我错了。以下工作正常: 现在,添加的第一个数字是保存为变量的双精度数,尽管第二个变量从捕获文本。例如

  • 我列了一张我把动物放进去的名单。但是当我想要它们在我的ListView中时,我得到了一个奇怪的符号???我错过了什么? 我的GUI

  • 问题内容: 试图在LINQ查询(使用Entityframework)中实现条件创建了奇怪的查询。在某些情况下,即使阈值设置为180秒,这些查询也会超时: 使用一些不太优雅的if语句,我没有任何问题,查询在几秒钟内返回: 条件语句都是从查询字符串传递的,这就是为什么它们有时可能带有值而有时却没有值的原因。 使用三元运算符时会出现相同的问题 关于这些内联条件为何表现如此差的情况,是否有合理的解释? 问

  • 我们有直到最近还在JDK8上的maven应用程序。我们刚刚将它们升级到JDK11,并试图通过将我们的实用程序库变成模块来利用JDK9的JPMS。 我们原来有这样的路径: 在那里,是"源根"。 因此,一位同事放置了模块信息。lib1文件夹中的java文件,并将其声明为: 从构建和工作的命令行,所以他假设一切都是模块的善良。 但当我在Intellij中打开时,它有一条难看的红线,消息说我应该将它移到源