Python 求两个二次函数的交点数

Python 求两个二次函数的交点数,python,math,Python,Math,我想找到交叉点的数量,但我的代码只有在所有a、b、c数字相等时才起作用。例如,如果我将a2更改为0,将c2更改为2,它应该打印2,但它打印0。你能找出错误吗 import matplotlib.pyplot as plt import math as m import numpy as np a1 = 1 b1 = 1 c1 = 1 a2 = 1 b2 = 1 c2 = 1 x1 = np.arange(-10, 10, 0.1) y1 = [] y2 = [] sum = 0 for x

我想找到交叉点的数量,但我的代码只有在所有a、b、c数字相等时才起作用。例如,如果我将a2更改为0,将c2更改为2,它应该打印2,但它打印0。你能找出错误吗

import matplotlib.pyplot as plt
import math as m
import numpy as np

a1 = 1
b1 = 1
c1 = 1
a2 = 1
b2 = 1
c2 = 1

x1 = np.arange(-10, 10, 0.1)

y1 = []
y2 = []
sum = 0
for x in x1:
    y1.append(a1 * m.pow(x, 2) + b1 * x + c1)
    y2.append(a2 * m.pow(x, 2) + b2 * x + c2)
    if (a1 - a2) * m.pow(x, 2) + (b1 - b2) * x + c1 - c2 == 0:
        sum += 1
print(sum)
plt.plot(x1, y1)
plt.plot(x1, y2)
plt.grid(True)
plt.show()

只需对
x
执行一些小步骤,就不可能得到精确解。如果要使用分数,请注意
x
也必须是分数,否则您总是会遇到精度问题。使用分数,只要你选择正确的
x
,就可以得到精确的等式。如果没有分数,则即使使用正确的
x
也很有可能由于以下原因而存在微小差异

找到精确解的一种方法是使用符号数学来求解方程组。例如,使用Python的

以下是一个例子:

从sympy导入等式、符号、绘图
从sympy.solvers导入求解
x=符号('x',实=真)
a1=2
b1=3
c1=4
a2=-5
b2=1
c2=12
方程=等式(a1*x*x+b1*x+c1,a2*x*x+b2*x+c2)
sol=求解(方程,x)
打印(“给定方程式:”,方程式)
打印(“找到的解决方案:”,sol)
打印(“作为浮动的解决方案:”,[s.evalf()表示sol中的s])
打印(“实际解决方案的数量:”,len(sol))
哪些产出:

Given equation: Eq(2*x**2 + 3*x + 4, -5*x**2 + x + 12)
Solutions found: [-1/7 + sqrt(57)/7, -sqrt(57)/7 - 1/7]
Solutions as float: [0.935690633610107, -1.22140491932439]
The number of real solutions: 2

请添加一个代码没有给出预期答案的示例。一个问题是您的测试
…==0
对于浮点几乎从不完全相等。另一个问题是,x的步长为0.1,这意味着可能永远不会达到两个方程相等的点。如果你想让你的测试太宽(
fabs(…)
),你可能会对同一个根计算两次。请看,这肯定是一个浮点问题(当然,除此之外还可能有其他错误)。一种解决方案是使用分数模块进行计算,因为您似乎确实在使用有理参数。您的代码(原样)可以通过使用分数修复涉及
==
的浮点错误,但仅希望您在交点采样的逻辑错误无法通过这种方式修复。尽管我推荐它(这是一个值得注意的好模块),但我认为分数毕竟不会真正帮助你。
分数
只在根是有理的情况下才相关,当然,一般情况下不是这样,即使系数是整数。你的解决方案是有道理的+1英寸。一般平方根不是分数。