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

# Matlab 三維函數求值及繪圖

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

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

??? 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

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)

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;

這樣就好囉