JOSH 發問時間: 電腦與網際網路程式設計 · 10 年前

Matlab 三維函數求值及繪圖

如題

假設y=f1(x), X=[x1,x2], X_0=[0.5,-0.9], delta=0.25, E=0.0001

y = f_1(x1,x2)= 1 - x1^2/4 - x2^2/4 - sin(-2x1 - 3x2)/2

我有初始值X_0, 可以求出相對應的y值(f_1), 接著要求出下一個X值,

函數為X(i)=X(i-1)+delta*g(i-1), 其g為gradient 的1*N vector.

g=[g1,g2]; g1=(f(x1+E)-f(x1))/E; g2=(f(x2+E)-f(x2))/E

用以上的程式代入後可求出往上一階的新y值,接下來一直循環到頂點為止。

條件f(x(i))-f(x(i-1))<t; t=0.0001

如何撰寫此程式並代入function[X,y]=test(function_name, X_0, delta),

使其畫出plot,plot3,meshgrid,及surf

已更新項目:

試著跑過,出現下列:

輸入 test('func',[0.5,-0.9],0.25)

??? Subscript indices must either be real positive

integers or logicals.

Error in ==> test_2 at 13

g1 = (function_name(xk1)-function_name(x))*1/E

且試著將function y = func(x)

以下的參數條件先不輸入,同樣出現以上結果

2 個已更新項目:

上面問題已解決,但跑出來的結果很奇怪

[xcol,ycol]=test('func',x0,0.25);

% x1範圍-1:0.1:1; x2範圍-1:0.1:1

[x1,x2]=meshgrid(-1:.1:1;-1:.1:1);

hold on

yy=1-0.25.*x1.^2-0.25.*x2.^2-0.5.*sin(-2.*x1-3.*x2);

surf(x1,x2,yy)

參考x1 x2為

0.50-0.9

0.40-0.83

0.32-0.77

..

.. 一直到

0.260.30

0.260.31

3 個已更新項目:

我會把最佳解答給你

幾個問題點待釐清

1. 執行完後x和y的初始值不會出現,如何呈現

2. 用原程式執行下列方程式,如何撰寫

y=f_2(x); X=[x1], X0=[220], f_2(x1)=9.78sin(2b(x1))-7.53cos(b(x1))-1.5sin(b(x1)),

b(x1)=2*pi(x1-81)/365, delta=50

y=f_3(x), X=[x1,x2,x3], X0=[0,0,0],

f_3(x1,x2,x3)=9*x1+8*x2+7*x3-6*x1^2-5*x2^2-4*x3^2+3*x1*x2+2*x1*x3+x2*x3,

delta=0.1

1 個解答

評分
  • Elisha
    Lv 6
    10 年前
    最佳解答

    我重整一下喔, 這樣會比較好寫, 所以先寫在這裡

    y = f(x)

    x = [x1, x2];

    x0 = [0.5, -0.9];

    delta = 0.25;

    E = 1e-4;

    y = 1 - x(1)^2/4 - x(2)^2/4 - sin(-2*x(1) -3*x(2))/2 --objective function

    2010-11-03 11:23:42 補充:

    g1 = (f(x1+E) - f(x1))/E, x2 is constant

    g2 = (f(x2+E) - f(x2))/E, x1 is cnostant

    x(i) = x(i-1) + delta*g(i-1);

    df = abs(f(i) - f(i-1));

    df < t , t = E;

    2010-11-03 16:05:22 補充:

    我寫的code你參考看看

    function [xcol, ycol] = test(function_name, x0, delta)x = x0;

    E = 1e-4;

    t = 1e-4;k = 0; kmaxit = 50; df = 1.0;

    xcol = [];

    ycol = [];

    while k < kmaxit && df > t

    xk1 = [x(1)+E, x(2)];

    xk2 = [x(1), x(2)+E];

    g1 = (function_name(xk1) - function_name(x))/E;

    g2 = (function_name(xk2) - function_name(x))/E;

    g = [g1,g2];

    xnew = x + delta*g;

    df = abs(function_name(xnew) - function_name(x));

    x = xnew;

    y = function_name(x);

    xcol = [xcol; x];

    ycol = [ycol; y];

    k = k + 1;

    end

    ------------

    function y = func(x)y = 1 - x(1)^2/4 - x(2)^2/4 - sin(-2*x(1) - 3*x(2))/2;

    -----------

    clear all

    clcx0 = [0.5, -0.9];

    delta = 0.25;

    function_name = @func;

    [x, y] = test(function_name, x0, delta);[x1,x2] = meshgrid(x(:,1),x(:,2));

    yy = 1 - x1.^2/4 - x2.^2/4 - sin(-2*x1 - 3*x2)/2;

    surf(x1,x2,yy)

    -----------

    至於plot, plot3, 我不太會用它們, 所以只用meshgrid 及 surf的指令

    2010-11-04 06:58:40 補充:

    嗯嗯, 我想, 我是直接用他尋找的點直接作切割, 所以網格大小不一致

    不過我想你要表現出來的是

    一張3D圖中, 依收斂值, 一直跑到最佳值...至於這個要想一想, 我只會劃2D的圖, 好像3D沒有這樣的功能

    2010-11-04 08:10:28 補充:

    1. 執行完後x和y的初始值不會出現,如何呈現

    不好意思, 我把

    xcol = [xcol; x];

    ycol = [ycol; y]; 位置應該放在最前面, 這樣初始值就會跑出來了

    2010-11-04 08:10:54 補充:

    while k < kmaxit && df > t

    y = function_name(x);

    xcol = [xcol; x];

    ycol = [ycol; y];

    .

    .

    .

    .

    .

    ---以上這樣

    2010-11-04 08:13:09 補充:

    2. 用原程式執行下列方程式,如何撰寫

    y=f_2(x); X=[x1], X0=[220], f_2(x1)=9.78sin(2b(x1))-7.53cos(b(x1))-1.5sin(b(x1)),

    b(x1)=2*pi(x1-81)/365, delta=50

    若是這一題

    只要把xk2拿掉, 因為只剩一個變數, 然後再把g2拿掉, 也是因為只有一個變數

    2010-11-04 08:15:18 補充:

    y=f_3(x), X=[x1,x2,x3], X0=[0,0,0],

    f_3(x1,x2,x3)=9*x1+8*x2+7*x3-6*x1^2-5*x2^2-4*x3^2+3*x1*x2+2*x1*x3+x2*x3,

    delta=0.1

    這個的話, 就多加一個變數

    xk1 = [x(1)+E, x(2)];

    xk2 = [x(1), x(2)+E];原本是這樣

    改成

    xk1 = [x(1)+E, x(2), x(3)];

    xk2 = [x(1), x(2)+E, x(3)];

    xk3 = [x(1), x(2)+E, x(3)+E];

    然後

    2010-11-04 08:17:26 補充:

    然後多一個g3

    g3 = (function_name(xk3) - function_name(x))/E;

    然後

    g = [g1,g2,g3];

    就可以囉

    寫不下了,寫到這裡來

    2010-11-04 08:19:43 補充:

    再補充一下第一題

    y=f_2(x); X=[x1], X0=[220], f_2(x1)=9.78sin(2b(x1))-7.53cos(b(x1))-1.5sin(b(x1)),

    b(x1)=2*pi(x1-81)/365, delta=50

    拿掉

    xk2, 然後

    xk1 = x(1) + E;

    g = g1;

    這樣就好囉

還有問題?馬上發問,尋求解答。