Tôi đang làm một tìm kiếm brute force cho "cực trị gradient" trên ví dụ hàm sauMathematica: điểm chi nhánh cho rễ thực sự của đa thức
fv[{x_, y_}] = ((y - (x/4)^2)^2 + 1/(4 (1 + (x - 1)^2)))/2;
này liên quan đến việc tìm kiếm các số không sau
gecond = With[{g = D[fv[{x, y}], {{x, y}}], h = D[fv[{x, y}], {{x, y}, 2}]},
g.RotationMatrix[Pi/2].h.g == 0]
nào Reduce
vui vẻ cho tôi:
geyvals = y /. Cases[[email protected]@Reduce[gecond, {x, y}], {y -> _}];
geyvals
là ba gốc của một đa thức khối, nhưng biểu thức là một chút lớn để đặt ở đây.
Bây giờ câu hỏi của tôi: Đối với các giá trị khác nhau của x
, các số khác nhau của những gốc này là có thật và tôi muốn chọn các giá trị của x
nơi chi nhánh giải pháp để ghép lại với nhau. (trong số fv
). Trong trường hợp hiện tại, vì đa thức chỉ là khối, tôi có thể làm điều đó bằng tay - nhưng tôi đang tìm kiếm một cách đơn giản để Mathematica làm điều đó cho tôi?
Chỉnh sửa: Để làm rõ: Công cụ Gradient extremals chỉ là nền - và cách đơn giản để thiết lập sự cố khó. Tôi không quan tâm đến giải pháp cụ thể cho vấn đề này như trong một cách thức tổng quát để phát hiện các điểm chi nhánh cho các rễ đa thức. Đã thêm câu trả lời dưới đây với phương pháp làm việc.
Chỉnh sửa 2: Kể từ khi có vẻ như vấn đề thực sự là niềm vui nhiều hơn phân nhánh rễ: rcollyer gợi ý sử dụng ContourPlot
trực tiếp trên gecond
để có được cực trị gradient. Để thực hiện điều này, chúng ta cần tách các thung lũng và rặng núi, được thực hiện bằng cách nhìn vào giá trị riêng của Hessian vuông góc với gradient. Đưa một tấm séc cho "valleynes" trong như một RegionFunction
chúng tôi là trái với chỉ dòng thung lũng:
valleycond = With[{
g = D[fv[{x, y}], {{x, y}}],
h = D[fv[{x, y}], {{x, y}, 2}]},
g.RotationMatrix[Pi/2].h.RotationMatrix[-Pi/2].g >= 0];
gbuf["gevalley"]=ContourPlot[gecond // Evaluate, {x, -2, 4}, {y, -.5, 1.2},
RegionFunction -> Function[{x, y}, [email protected]],
PlotPoints -> 41];
Mà cho chỉ dòng đáy thung lũng. Trong đó có một số đường nét và điểm yên ngựa:
fvSaddlept = {x, y} /. [email protected][Thread[D[fv[{x, y}], {{x, y}}] == {0, 0}]]
gbuf["contours"] = ContourPlot[fv[{x, y}],
{x, -2, 4}, {y, -.7, 1.5}, PlotRange -> {0, 1/2},
Contours -> [email protected] (Range[6]/3 - .01),
PlotPoints -> 41, AspectRatio -> Automatic, ContourShading -> None];
gbuf["saddle"] = Graphics[{Red, Point[fvSaddlept]}];
Show[gbuf /@ {"contours", "saddle", "gevalley"}]
Chúng tôi kết thúc với một cốt truyện như thế này:
Tôi đã làm điều này bằng tay một vài lần, vì vậy +1. Hy vọng ai đó tìm đường. –
@belisarius. Chính xác - đã thực hiện nó một vài lần, và nó là một mối phiền toái. Thời gian này tôi không thể làm phiền vì tôi thực sự chỉ cần kết quả cho một âm mưu ở đâu, để được hoàn toàn trung thực, một đoán đơn giản sẽ tốt ... Hãy hy vọng ai đó có một ý tưởng thông minh :) – Janus
@ Janus, tha thứ cho sự thiếu hiểu biết của tôi , nhưng làm thế nào để 'gecond' cung cấp cho bạn các cực đoan? Tôi chỉ không nhìn thấy nó. – rcollyer