Cho một tập hợp các điểm trong , tôi muốn để tính
Bất cứ ý tưởng làm thế nào để tránh những?
Cho một tập hợp các điểm trong , tôi muốn để tính
Bất cứ ý tưởng làm thế nào để tránh những?
Câu trả lời:
Cách tính
Tính trọng số bậc hai Clenshaw-Curtis trên lưới cực trị Ch Quashev với :
Biến đổi các trọng số thành lưới tùy ý , thông qua ma trận biến đổi để có được các trọng số tìm kiếm ,
Về nguyên tắc, đây chỉ là phương trình bậc hai Clenshaw-Curtis với các giá trị hàm trên lưới tùy ý , nhưng thu được bằng cách chuyển đổi cơ bản (đối với một giới thiệu chung về Clenshaw-Curtis, xem ví dụ như bài báo Trefethen).
Thuật toán dường như khá ổn định, đặc biệt khi so sánh với phương pháp Vandermonde như được cung cấp trong câu trả lời của @Kirill : mặc dù nó theo cùng một ý tưởng - tạo ra các trọng số bậc hai trong một cơ sở đã biết và sau đó chuyển sang lưới mới - điều này có thể đã được dự kiến vì sự chuyển đổi về mặt ma trận Vandermonde thường bị điều hòa rất cao.
Ví dụ: Tạo trọng lượng cầu phương Legendre-lobatto
Chúng tôi xem xét ví dụ về quy tắc bậc hai Legendere-lobatto và so sánh độ chính xác với phương pháp đơn trị. Là một tài liệu tham khảo, chúng tôi sử dụng các trọng số vuông góc thu được bằng các Golub-Welsch thuật toán cho khác nhau và tính toán sai số tích lũy
Ví dụ: Tạo công thức bậc hai Newton-Cotes
Chúng tôi xem xét việc tạo ra công thức bậc hai Newton-Cotes trên các lưới cách đều nhau. Một lần nữa, người ta mong đợi một điều hòa không tốt, vì, trong ngắn hạn, cho phép nội suy đa thức các lưới cách đều nhau là baaad.
Trong hình sau đây, tôi đã tính tổng tuyệt đối của các trọng số .
Lên đến 50 điểm lưới, kết quả của phương pháp đơn thức và Clenshaw-Curtis đồng ý. Sau đó, Clenshaw-Curtis trở nên tốt hơn - vì những gì nó đáng giá. Một cách giải thích trực tiếp là, lưới cách đều nhau làm hỏng mọi thứ, giả sử, . Tuy nhiên, vào khoảng , điều kiện của ma trận Vandermonde lại xuất hiện và dẫn đến một kết quả thậm chí còn tồi tệ hơn.
Ví dụ: phương trình bậc hai Guass-Patterson
Ví dụ này là do @ NicoSchlömer. Tôi đã không biết các quy tắc này cho đến nay, vì vậy tôi đã lấy các abscissas từ việc triển khai này và áp dụng cả phương pháp Vandermonde và Clenshaw-Curtis đã chuyển đổi (trong đó, như trên, cách tiếp cận Vandermonde đang sử dụng thuật toán Bjork-Pereyra).
Như đã đề xuất trong bình luận, sau đó tôi đã tính toán lỗi tích hợp hàm hằng bằng
Từ bức tranh này, cách tiếp cận Clenshaw-Curtis được chuyển đổi có vẻ hiệu quả hơn so với cách tiếp cận Vandermonde (ít nhất là trong số học chính xác hữu hạn). Tuy nhiên, Clenshaw-Curtis phá vỡ bắt đầu từ chỉ số 7, vì vậy các phương pháp khác nên được sử dụng.
module VandermondeInverse
using SpecialMatrices
function main(n=8)
X = Rational{BigInt}[k//(n-1) for k=0:n-1]
# X = convert(Vector{Rational{BigInt}}, linspace(-1, 1, n))
x = convert(Vector{Float64}, X)
A = convert(Matrix{Rational{BigInt}}, Vandermonde(X))
b = [i%2==0 ? 2//(i+1) : 0 for i=0:n-1]
println("Norm: ", norm(A, Inf))
println("Norm of inverse: ", norm(inv(A), Inf))
println("Condition number: ", cond(convert(Matrix{Float64}, A)))
ans = A'\b
println("True answer: ", ans)
B = convert(Matrix{Float64}, A)
c = convert(Vector{Float64}, b)
println("Linear solve: ", norm((B'\c - ans)./ans, Inf))
d = vec(c')
for k=1:n, l=n:-1:k+1
d[l] -= x[k]*d[l-1]
end
for k=n-1:-1:1, l=k:n
if l > k
d[l] /= x[l]-x[l-k]
end
if l < n
d[l] -= d[l+1]/(x[l+1] - x[l-k+1])
end
end
println("Neville elimination: ", norm((d-ans)./ans, Inf))
nothing
end
end
V = VandermondeInverse
Đầu ra:
julia> V.main(14)
Norm: 14.0
Norm of inverse: 1.4285962612120493e10
Condition number: 5.2214922998851654e10
True answer: Rational{Int64}[3202439130233//2916000,-688553801328731//52390800,19139253128382829//261954000,-196146528919726853//785862000,6800579086408939//11642400,-43149880138884259//43659000,32567483200938127//26195400,-7339312362348889//6237000,48767438804485271//58212000,-69618881108680969//157172400,44275410625421677//261954000,-2308743351566483//52390800,11057243346333379//1571724000,-209920276397//404250]
Linear solve: 1.5714609387747318e-8
Neville elimination: 1.3238218572356314e-15
Nếu X
không tích cực như trong thử nghiệm này, thì có vẻ như các lỗi tương đối có cùng thứ tự như với một giải pháp tuyến tính thông thường.
V.main(32)
tạo ra một câu trả lời hợp lý trong khoảng một giây trên máy tính xách tay của tôi (trong khi chỉ sử dụng một ít bộ nhớ). Các con số thậm chí không lớn, tử số lớn nhất có 54 chữ số, vì vậy tôi nghi ngờ có điều gì đó không ổn với bạn. Bạn có thể đăng một ý chính, bởi vì tôi tò mò muốn xem nó thất bại như thế nào?
Float64
cho d
: kiểm tra với @show typeof(d)
. Hãy cho tôi biết nếu bạn tìm thấy nhiều vấn đề hơn với nó.