2016-11-09 13 views
1

Ich aktualisierte die Frage, um es mehr zu klären. Hier ist ein Diagramm:Optim-nichtlineare Gleichung in Matlab-Code

Für die Kurve in dem beigefügten Foto hoffe ich, die Kurve zu zeichnen. Ich habe seine Gleichung, und es ist nach Vereinfachung wie diese

% Eq-2 
    (b*Y* cos(v) + c - k*X*sin(v))^2 + ... 
sqrt(k*X*(cos(v) + 1.0) + b*Y*sin(v))^2) - d = 0.0 

Wo wird:

v = atan((2.0*Y)/X) + c 

und b, c, d und k Konstanten sind.

aus dem beigefügten Diagramm,

ist die Kurve in zwei Punkten:

p1 @ (x=0) 
p2 @ (y=0) 

ich ein neues so akzeptieren auf Codierung meine entschuldige mich, wenn meine Frage nicht klar ist. So

Dank

+0

Wenn es sich um eine halb-Parabel ist, warum Sie nicht die klassische lineare Form Y implementieren = a * x^2 + b * x + c (unter der Annahme, dass die Symmetrieachse der Parabel parallel zu Y ist, a> 0, wenn sie konkav ist, b = 0, wenn der Eckpunkt genau auf der Y-Achse liegt)? (Ich denke, wie man in Ihrem Fall antwortet) – marcoresk

+0

Es ist nicht wirklich parabolisch. Da ich kein Bild anhängen konnte, wollte ich die Kurvenform califizieren. Wir haben seine Gleichung und die Grenze. –

+3

Sie haben vergessen, eine Frage zu stellen. – Adriaan

Antwort

0

Also, ich hatte Spaß mit dieser (danke dafür)!

Andere Frage, andere Antwort.

Die Lösung unter sucht zuerst die Konstanten, die die X und Y abfängt, wodurch Sie suchen (p1 und p2). Für diejenigen Konstanten, die am besten zu dem Problem passen, wird ein Diagramm erstellt, das numerische Probleme berücksichtigt.

In der Tat brauchen Sie nicht eq. 1, weil das immer für jede Kurve gilt - es ist nur da, um Sie zu verwirren, und problematisch zu verwenden.

So, hier ist es:

function C = solve_for_F() 

    % Points of interest 
    px = 6; 
    py = 4.2; 

    % Wrapper function; search for those constants 
    % causing the correct X,Y intercepts (at px, py) 
    G = @(C) abs(F(0, px, C)) + ... % X intercept at px 
      abs(F(py, 0, C));  % Y intercept at py 

    % Initial estimate, based on your original equation 
    C0 = [5/33 
      1247745517111813/562949953421312 
      4243112111277797/4503599627370496 
      5/66]; 

    % Minimize the error in G by optimizing those constants 
    C = fminsearch(G, C0); 

    % Plot the solutions 
    plot_XY(px, py, C); 

end 

function plot_XY(xmax,ymax, C) 

    % graininess of X 
    N = 100; 

    % Find solutions for all alphae 
    Y  = zeros(1,N); 
    X  = linspace(0, xmax, N); 
    y0  = linspace(ymax, 0, N); 
    options = optimset('Display', 'off',...,... 
         'TolX' , 1e-10); 

    % Solve the nonlinear equation for each X 
    for ii = 1:numel(X) 

     % Wrapper function for fzero() 
     fcn1 = @(y)F(y, X(ii), C); 

     % fzero() is probably the fastest and most intuitive 
     % solver for this problem 
     [Y(ii),~,flag] = fzero(fcn1, y0(ii), options); 

     % However, it uses an algorithm that easily diverges 
     % when the function slope is large. For those cases, 
     % solve with fminsearch() 
     if flag ~= 1 

      % In this case, the minimum of the absolute value 
      % is searched for (which should be zero) 
      fcn2 = @(y) abs(fcn1(y)); 

      Y(ii) = fminsearch(fcn2, y0(ii), options); 
     end 

    end 

    % Now plot the X,Y solutions 
    plot(X, Y,... 
     'linewidth', 2,... 
     'color',  [1 0.65 0]);  
    xlabel('X'), ylabel('Y') 
    axis([0 xmax+.1 0 ymax+.1]) 

end 

function fval = F(Y, X, C) 

    % Unpack constants 
    b = C(1); d = C(3); 
    c = C(2); k = C(4); 

    % pre-work 
    V = atan2(2*Y, X) + c; 

    % Eq. 2 
    fval = sqrt((b*Y*sin(V) + k*X*(cos(V) + 1))^2 + ... 
       (b*Y*cos(V) - k*X* sin(V) )^2 ) - d; 
end 

solution

1

, nach dem bearbeiten, ist es ein bisschen mehr klar, was Sie wollen.

Ich bestehen darauf, dass Ihre Gleichung funktioniert - die ursprüngliche Gleichung (vor Ihrer Bearbeitung) vereinfacht, was ich unten habe. Die Kurve dafür sieht wie Ihre Grafik aus, außer dass die X und Y Abschnitte an verschiedenen Orten sind, und funky stuff passiert in der Nähe von X = 0, weil Sie numerische Probleme mit der Tangente haben (Sie könnten das Problem neu formulieren wollen).

Aber nach der Gleichung Überprüfung der folgende Code sollte hilfreich sein:

function solve_for_F() 

    % graininess of alpha 
    N = 100; 

    % Find solutions for all alphae 
    X  = zeros(1,N); 
    options = optimset('Display', 'off');  
    alpha = linspace(0, pi/2, N); 
    x0  = linspace(6, 0, N); 

    for ii = 1:numel(alpha)  
     X(ii) = fzero(@(x)F(x, alpha(ii)), x0(ii), options); 
    end 

    % Convert and make an X-Y plot 
    Y = X .* tan(alpha); 

    plot(X, Y,... 
     'linewidth', 2,... 
     'color',  [1 0.65 0]); 

end 

function fval = F(X, alpha) 

    Y = X*tan(alpha); 

    % Please, SIMPLIFY in the future 
    A = 1247745517111813/562949953421312; 
    B = 4243112111277797/4503599627370496; 
    V = atan2(2*Y,X) + A; 

    eq2 = sqrt( (5/33*(Y*sin(V) + X/2*(cos(V) + 1)))^2 + ... 
       (5/33*(Y*cos(V) - X/2* sin(V)  ))^2 ) - B; 

    fval = eq2; 

end 

Ergebnisse:

plot results

+0

Vielen Dank Rody, für Ihre Mühe. Ich habe die Frage aktualisiert. vielen Dank nochmals –

+0

@AD_Matlab: Tatsächlich hängen die 'X' und' Y' Abschnitte entscheidend von den Werten dieser Konstanten ab ... Das ist nicht Teil der Frage, oder? Oder wollen Sie Konstanten '[b c d k]' finden, die für 'p1' und' p2' auflösen? Das ist eine ganz andere Frage ... –

+0

Lieber Rody, ich schätze deine Zeit und Hilfe sehr. Die Konstante b, c, d, k ist in der Gleichung konstant wie diejenige, die Sie verwendet haben (A, B, C). Allerdings kann ich Tippfehler in Eq-2 und V sehen, ich wiederhole das vereinfacht wie folgt: A = 1247745517111813/562949953421312; B = 4243112111277797/4503599627370496; V = Atan ((2 · KII)/KI) + A; eqn = sqrt ((5/33 * y * sin (V) + (5 × X * (cos (V) + 1))/66)^2 + ((5/33 * y * cos (V)) - 5/66 * x * sin (V))^2) - B == 0 –