从f建立一条平均线
我有一系列类似于直线的点-这些点来自第三方应用程序,由于其精度低,它们不在一条线上,即使它们应该在一条线上-请参阅下图。我现在正试图设计一个算法,从这些点重建一条直线。我将感谢对此事的任何建议/解决方案。
非常感谢您的关注 线性回归可能可以做到这一点,尽管它可能不容易编程。
同意,研究最小二乘法。 谢谢你们的建议,先生们。我将研究这些定理背后的数学,看看是否能够在AutoLISP中实现它们。 因为你只有一个因变量和一个自变量,你可以使用简单的线性回归。。。
测试代码:
(defun c:test ( / i l s )
(if (setq s (ssget '((0 . "POINT") (-4 . "*,*,=") (10 0.0 0.0 0.0))))
(progn
(repeat (setq i (sslength s))
(setq l (cons (cdr (assoc 10 (entget (ssname s (setq i (1- i)))))) l))
)
(_lineartrendline l)
)
)
(princ)
) 李,我不得不说,那真的很了不起!非常感谢您的支持!
这是一种定义lambda函数的有趣方法;这是我第一次看到它。
非常感谢米尔恰!
我很高兴你喜欢它,我有时会使用这个结构来实现额外的简洁;但是,请注意,严格来说,它不是lambda函数,而是defun-q表达式的文字等价物,例如:
_$ (defun-q f ( x ) (* x x))
F
_$ f
((X) (* X X))
_$ (setq g '(( x ) (* x x)))
((X) (* X X))
_$ (equal f g)
T 李可以在弧上或圆上 礼炮Mircea
线性回归确保一系列值(例如y)和近似线之间的差值之和最小。
如果数据符合某些标准,则效果良好。
例如,围绕垂直线设置点,然后使用简单的线性回归(如李的lisp。顺便说一句,李,你的代码太棒了)。
这是我的lisp,使用了另一个(令人惊讶的)域中的公式。
(defun C:TEST ( / vxv ss i n l o d dx dy a)
(defun vxv (a b) (apply '+ (mapcar '* a b)))
(if
(setq ss (ssget '((0 . "POINT"))))
(progn
(repeat (setq i (sslength ss) n i)
(setq l (cons (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))) l))
)
(setq o(mapcar '/ (apply 'mapcar (cons '+ l)) (list n n))
d(mapcar '(lambda (a) (mapcar '- o a)) l)
dx (mapcar 'car d)
dy (mapcar 'cadr d)
a(* 0.5 (atan (* 2 (vxv dx dy)) (- (vxv dx dx) (vxv dy dy))))
)
(entmake
(list
'(0 . "XLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbXline")
'(62 . 1)
(cons 10 o)
(list 11 (cos a) (sin a) 0.0)
)
)
)
)
(princ)
) Multumesc mult Stefan pentru solutie!非常感谢Stefan提出的解决方案。
虽然这两个例程的结果在一组分散的点上略有不同,但对于我必须处理的数据,它们都给出了极好的结果。
再次感谢各位的宝贵支持。
页:
[1]
2