python椭圆拟合_python - python中的多元曲线拟合,用于估计椭圆形形状的参数和阶数 - 堆栈内存溢出...

我使用了一个不同的方程式,我在这里找到了 。 我还使用了新的Numpy随机生成器,但是我认为这仅仅是解决这个问题的一种方法。 我正在使用matplotlib的补丁绘制椭圆,这确实很美,但绝对是代表圆锥曲线的更好解决方案。 重要的是,我将dogbox方法用于curve_fit,因为其他方法无法收敛。 有时椭圆形不匹配并且降低了添加的噪声(例如, rng.normal(0, 1, (500, 2)) / 1e2代替rng.normal(0, 1, (500, 2)) / 1e1帮助) 。 无论如何,下面的代码段和图。

import numpy as np

from numpy.random import default_rng

from matplotlib.patches import Ellipse

import matplotlib.pyplot as plt

from scipy.optimize import curve_fit

def func(data, a, b, h, k, A):

x, y = data

return ((((x - h) * np.cos(A) + (y - k) * np.sin(A)) / a) ** 2

+ (((x - h) * np.sin(A) - (y - k) * np.cos(A)) / b) ** 2)

rng = default_rng(3)

numPoints = 500

center = rng.random(2) * 10 - 5

theta = rng.uniform(0, 2 * np.pi, (numPoints, 1))

circle = np.hstack([np.cos(theta), np.sin(theta)])

ellipse = (circle.dot(rng.random((2, 2)) * 2 * np.pi - np.pi)

+ (center[0], center[1]) + rng.normal(0, 1, (500, 2)) / 1e1)

pp, pcov = curve_fit(func, (ellipse[:, 0], ellipse[:, 1]), np.ones(numPoints),

p0=(1, 1, center[0], center[1], np.pi / 2),

method='dogbox')

plt.scatter(ellipse[:, 0], ellipse[:, 1], label='Data Points')

plt.gca().add_patch(Ellipse(xy=(pp[2], pp[3]), width=2 * pp[0],

height=2 * pp[1], angle=pp[4] * 180 / np.pi,

fill=False))

plt.gca().set_aspect('equal')

plt.tight_layout()

plt.show()

为了合并指数值,我使用了您的方程式,并根据该答案生成了一个椭圆。 结果是:

import numpy as np

from numpy.random import default_rng

from matplotlib.patches import Ellipse

import matplotlib.pyplot as plt

from scipy.optimize import curve_fit, root

from scipy.special import ellipeinc

def angles_in_ellipse(num, a, b):

assert(num > 0)

assert(a < b)

angles = 2 * np.pi * np.arange(num) / num

if a != b:

e = (1.0 - a ** 2.0 / b ** 2.0) ** 0.5

tot_size = ellipeinc(2.0 * np.pi, e)

arc_size = tot_size / num

arcs = np.arange(num) * arc_size

res = root(lambda x: (ellipeinc(x, e) - arcs), angles)

angles = res.x

return angles

def func(data, a, b, c):

x, y = data

return (np.absolute(x) / a) ** c + (np.absolute(y) / b) ** c

a = 10

b = 20

n = 100

phi = angles_in_ellipse(n, a, b)

e = (1.0 - a ** 2.0 / b ** 2.0) ** 0.5

arcs = ellipeinc(phi, e)

noise = default_rng(0).normal(0, 1, n) / 2

pp, pcov = curve_fit(func, (b * np.sin(phi) + noise,

a * np.cos(phi) + noise),

np.ones(n), method='lm')

plt.scatter(b * np.sin(phi) + noise, a * np.cos(phi) + noise,

label='Data Points')

plt.gca().add_patch(Ellipse(xy=(0, 0), width=2 * pp[0], height=2 * pp[1],

angle=0, fill=False))

plt.gca().set_aspect('equal')

plt.tight_layout()

plt.show()

随着降低噪声值,pp趋向于(b,a,2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值