Tôi đang cố viết một gói trong Go để tính toán phương trình bằng loại "chung". Để cụ thể, tôi muốn triển khai xấp xỉ runge kutta 5.Go (ngôn ngữ) kiểu số/giao diện chung
xấp xỉ này tính toán giá trị của một (không rõ) chức năng y
tại điểm t0 + h
chỉ sử dụng các giá trị của y
tại t0
, thời gian bắt đầu t0
, chiều rộng bước h
và một phương trình vi phân dgl
mà có dạng dy/dt = g(t,y)
nơi g
là một số chức năng.
Phép tính xấp xỉ này hoạt động giống hệt nhau khi làm việc với các loại vô hướng khi làm việc với vec-tơ (hoặc thậm chí ma trận). Nói chung hơn: Nó hoạt động với mọi thứ có thể được cộng/trừ vào giá trị cùng loại và có thể được thu nhỏ bằng vô hướng (mà tôi sử dụng float64
)
Vì vậy, tôi đã cố gắng thể hiện điều này dưới dạng giao diện Go:
type Numeric interface {
Add(rhs Numeric) Numeric
Sub(rhs Numeric) Numeric
Mul(rhs float64) Numeric
}
Nhưng khi tôi cố gắng để "thực hiện" giao diện này, tôi chạy vào rắc rối vì các thông số gõ:
type Vec6F struct {
x, y, z float64
vx, vy, vz float64
}
func (lhs *Vec6F) Add(rhs *Vec6F) rk5.Numeric {
result := new(Vec6F)
result.x = lhs.x + rhs.x
result.y = lhs.y + rhs.y
result.z = lhs.z + rhs.z
result.vx = lhs.vx + rhs.vx
result.vy = lhs.vy + rhs.vy
result.vz = lhs.vz + rhs.vz
return result
}
này mang lại cho tôi những lỗi
cannot use result (type *Vec6F) as type rk5.Numeric in return argument:
*Vec6F does not implement rk5.Numeric (wrong type for Add method
have Add(*Vec6F) rk5.Numeric
want Add(rk5.Numeric) rk5.Numeric
đó là, một mặt hoàn toàn logic để tôi (vì RHS có thể là một đối tượng thực hiện Numeric)
Nhưng mặt khác: Làm thế nào để thể hiện một cái gì đó như thế tại Gò? Trong C + +, tôi có thể sử dụng toán tử quá tải thay thế, nhưng điều đó không thể thực hiện được.
"ngoài chủ đề": phương trình vi phân được giải quyết là phương trình mô tả quỹ đạo mars (đơn giản). Để biết mã hoàn chỉnh nhanh chóng, hãy xem http://play.golang.org/p/GwehylBbLK –