Tích hợp đa thức Lagrange với nhiều nút, làm tròn


10

Cho một tập hợp các điểm {xj}j= =1n trong [-1,1] , tôi muốn để tính

-11LTôi(x)dx
chính xác. LTôi là đa thức đối với các điểm với Lagrangexj vớixTôi như nút, tức là
LTôi(x)= =ΠjTôix-xjxTôi-xj.
Vì đây là một đa thức bậcn, tôi có thể sử dụng bất kỳ phương trình Gaussian cũ nào có đủ độ. Điều này hoạt động tốt nếunkhông quá lớn, nhưng dẫn đến kết quả bị lỗi do lỗi làm tròn cholớnn.

Bất cứ ý tưởng làm thế nào để tránh những?


3
Điều này phụ thuộc vào vị trí của , nhưng bạn đã kiểm tra xem L i của bạn có cư xử tốt không? Trong trường hợp xấu nhất, với x j được phân phối đồng đều, bạn sẽ gặp hiện tượng Runge ( L i dao động và lớn), trong trường hợp đó, nó không thực sự gây ra lỗi tròn. xjLixjLi
Kirill

2
Ngoài ra, nitpick: chia cho số nhỏ là một hoạt động có điều kiện tốt, nó là phép trừ tiếp theo của số lớn gần bằng nhau bị điều hòa và dẫn đến mất ổn định số.
Kirill

Có vẻ như bạn đang cố gắng tính toán nơiVlà ma trận vandermonde củaxj's. Bạn có thể nói số điều kiện củaVlà gì không? (2,0,23,0,25,0,)V1VxjV
Kirill

Câu trả lời:


5

Cách tính

11Lk(x)dx
cho Lagrange đa thứcLk xác định trên một lưới tùy ýxk,k=0,,n có thể được thực hiện bởi hai bước sau:

  1. Tính trọng số bậc hai Clenshaw-Curtis wkcc trên lưới cực trị Ch Quashev yk với k=0,,n :

    yk=cos(kπn)wkcc=ckn(1j=1n/2bj4j21cos(2πjkn))
    trong đóbk: =1vớik= =n/2, nếu không thìbk:=2ck:=1vớik=0hoặck=n, nếu không thìck:=2. Xem bài báo của Waldvogel (2006) để biết thêm chi tiết.

  2. Biến đổi các trọng số wkcc thành lưới tùy ý xk,k=0,,n , thông qua ma trận biến đổi M để có được các trọng số tìm kiếm wk ,

    wk=jMkjwjcc
    trong đó
    Mjk = Lj(yk).

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 ý xk , 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 wkLeg thu được bằng các Golub-Welsch thuật toán cho khác nhau n và tính toán sai số tích lũy

ϵn=k=1n(wkwkLeg)2
Dưới đây là kết quả: nhập mô tả hình ảnh ở đây Một nhận xét rằng các trọng cầu phương Clenshaw-Curtis là hoàn toàn ổn định trong suốt dải coi là gridpoints và tái tạo các trọng Legendre lên đến độ chính xác máy ( ϵ1015 ).


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ố i|wi|/N . nhập mô tả hình ảnh ở đây

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ử, n>10 . Tuy nhiên, vào khoảng n=50 , đ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

ε= =1n|2-ΣTôi= =1nwTôi|,
với kết quả sau:

nhập mô tả hình ảnh ở đây 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.


Cảm ơn câu trả lời thú vị. Tôi đã chơi xung quanh với nó một chút, nhưng thấy vòng đấu có ý nghĩa. Ví dụ: tổng của phải luôn là 2. Điều đó đúng đến n <5, nhưng với n == 6 tôi đã nhận được 1.9999949955991916, với và lỗi trong số thập phân đáng kể thứ 7. wk
Nico Schlömer

Tôi quên đề cập đến điều này với các điểm Gauss-Patterson, github.com/nschloe/quadpy/blob/master/quadpy/line_seribution/ Lỗi .
Nico Schlömer

@ NicoSchlömer: ok, thật thú vị, bởi vì ngoại trừ số học chính xác tùy ý (mà việc triển khai julia dường như cung cấp), thật khó để lý giải cách tiếp cận Vandermonde dù sao cũng chính xác hơn (vì Vandermonde là một trong những ví dụ chính cho một ví dụ chính ma trận điều hòa). Tôi sẽ chỉnh sửa câu hỏi và xem xét phương trình bậc hai Gauss-Patterson.
davidhigh

Cảm ơn David đã xem xét tất cả những điều này. Thật là thú vị! Tôi nghĩ rằng nó sẽ là một bổ sung đáng giá của bài đăng này để bao gồm một so sánh với bình phương Gauss-Legendre bình thường ở mức độ thích hợp. Tôi đoán nó thực hiện giống như cách tiếp cận Clenshaw-Curtis của bạn. Ngoài ra, đặt mã trên github hoặc như vậy và liên kết nó từ đây sẽ hữu ích cho bất cứ ai nhìn vào điều này trong tương lai. Nếu bạn liên kết câu trả lời được bình chọn hàng đầu, tôi sẽ đặt câu trả lời này là "chính xác" vì những hiểu biết thú vị.
Nico Schlömer

@ NicoSchlömer: cảm ơn bạn. Bạn có ý nghĩa gì khi so sánh với Gauss-Legendre? (vì trọng lượng Gauss-Legendre được sao chép chính xác cho máy). Sự so sánh giữa Leg. và CC được Trefethen thực hiện, với kết quả là độ chính xác của CC thường tương đương nhau. Điều thực sự thú vị là nghiên cứu hiệu suất của các lưới tùy chỉnh khác nhau và so sánh nó với Legendre hoặc Clenshaw-Curtis. Hơn nữa, tôi liên kết câu trả lời được bình chọn hàng đầu.
davidhigh

10

bV1b=(2,0,23,0,25,0,)

0x1<x2<<xnVb0x1O(n2)Lix12(x+1)

Ôi(εmmộtch)

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 Xkhô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.

bV-1LTôiLTôi(xj)= =δTôijαjkLk

Lk(x)= =Σj,kαj,kxj= =(1,x,x2,Giáo dục,xn)(α0k,Giáo dục,αnk),
L
L= =(α00α0nαn0αnn).
LkL(1,x,Giáo dục,xn)
(1,x,x2,,xn)L=(L0(x),L1(x),,Ln(x)).
Lk(xj)=δjk
(1x0x02x0n1xnxn2xnn)L=I,
L=V1Vxj

-11xkdx= =1+(-1)kk+1

-11Lk(x)dx= =Σjαjk1+(-1)kk+1= =(2,0,23,0,25,0,Giáo dục)(α0k,Giáo dục,αnk).
n+1k= =0Giáo dụcn(2,0,23,0,)LL=V1

Cảm ơn câu trả lời công phu! Để thêm rõ ràng hơn nữa, bạn có thể cung cấp thêm chi tiết về cách đưa vấn đề vào dạng Vandermonde không?
Nico Schlömer 18/03/2017

@ NicoSchlömer Chắc chắn, xem chỉnh sửa. Cảm ơn bạn cho câu hỏi, tôi không biết thuật toán này thậm chí còn tồn tại.
Kirill

n=16n=31

@ NicoSchlömer Hừm, tôi không thể sao chép rằng: với đoạn mã trên, sẽ 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?
Kirill

1
@ NicoSchlömer Nếu bạn muốn nói là cách nó bắt đầu sử dụng BigFloat khi in các lỗi tương đối cho đầu ra, tôi không chắc chắn quy tắc là gì. Nhưng tôi chắc chắn rằng nó sử dụng Float64cho 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ó.
Kirill

2

Tính toán các sản phẩm của người đề cử và mẫu số trước rồi chia một lần. Hai sản phẩm phải có cùng độ lớn, do đó không có lỗi làm tròn đáng kể. Ngoài ra, bạn nhận được lợi ích gia tăng của tốc độ tăng, do số lượng tính toán dấu phẩy động giảm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.