mirror of
https://github.com/snowykami/mbcp.git
synced 2025-06-08 13:35:22 +00:00
71 lines
2.0 KiB
Python
71 lines
2.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
|
|
|
@Time : 2024/8/9 上午11:32
|
|
@Author : snowykami
|
|
@Email : snowykami@outlook.com
|
|
@File : equation.py
|
|
@Software: PyCharm
|
|
"""
|
|
|
|
from mbcp.mp_math.mp_math_typing import OneVarFunc, Var, MultiVarFunc, Number
|
|
from mbcp.mp_math.point import Point3
|
|
from mbcp.mp_math.const import EPSILON
|
|
|
|
|
|
class CurveEquation:
|
|
def __init__(self, x_func: OneVarFunc, y_func: OneVarFunc, z_func: OneVarFunc):
|
|
"""
|
|
曲线方程。
|
|
:param x_func:
|
|
:param y_func:
|
|
:param z_func:
|
|
"""
|
|
self.x_func = x_func
|
|
self.y_func = y_func
|
|
self.z_func = z_func
|
|
|
|
def __call__(self, *t: Var) -> Point3 | tuple[Point3, ...]:
|
|
"""
|
|
计算曲线上的点。
|
|
Args:
|
|
*t:
|
|
|
|
Returns:
|
|
|
|
"""
|
|
if len(t) == 1:
|
|
return Point3(self.x_func(t[0]), self.y_func(t[0]), self.z_func(t[0]))
|
|
else:
|
|
return tuple([Point3(x, y, z) for x, y, z in zip(self.x_func(t), self.y_func(t), self.z_func(t))])
|
|
|
|
def __str__(self):
|
|
return "CurveEquation()"
|
|
|
|
|
|
def get_partial_derivative_func(func: MultiVarFunc, var: int | tuple[int, ...], epsilon: Number = EPSILON) -> MultiVarFunc:
|
|
"""
|
|
求N元函数偏导函数。
|
|
Args:
|
|
func: 函数
|
|
var: 变量位置,可为整数(一阶偏导)或整数元组(高阶偏导)
|
|
epsilon: 偏移量
|
|
Returns:
|
|
偏导函数
|
|
"""
|
|
if isinstance(var, int):
|
|
def partial_derivative_func(*args: Var) -> Var:
|
|
args_list_plus = list(args)
|
|
args_list_plus[var] += epsilon
|
|
args_list_minus = list(args)
|
|
args_list_minus[var] -= epsilon
|
|
return (func(*args_list_plus) - func(*args_list_minus)) / (2 * epsilon)
|
|
return partial_derivative_func
|
|
elif isinstance(var, tuple):
|
|
for i in var:
|
|
func = get_partial_derivative_func(func, i, epsilon)
|
|
return func
|
|
else:
|
|
raise ValueError("Invalid var type")
|