2017-03-08 67 views
0

Matlab的簡單循環我寫了一個簡單MATLAB腳本,以評估forwardbackwardcentral第一和第二導的差異近似爲一個spesific功能對於不同的函數變量

(y = x^3-5x)

在兩個不同x

(x=0.5 and x = 1.5) 

和7個不同步長h和比較相對誤差分析衍生物的近似值。

但是,我需要每次手動輸入xh值。問題是,我該如何爲7個不同的h值和2個不同的x值創建一個循環,並將所有結果作爲矩陣?

clc 
clear all 
close all 

h = 0.00001; 
x1 = 0.5; 

y = @(x) x.^3 - 5*x; 
dy = @(x) 3*x.^2 - 5; 
ddy = @(x) 6*x; 
d1 = dy(x1); 
d2 = ddy(x1); 

%Forward Differencing 

f1 = (y(x1+h) - y(x1))/h; 
f2 = (y(x1+2*h) - 2*y(x1+h) + y(x1))/(h.^2); 

%Central Differencing 

c1 = (y(x1+h)-y(x1-h))/(2*h); 
c2 = (y(x1+h)-2*y(x1)+y(x1-h))/(h.^2); 

% Backward Differencing 

b1 = (y(x1) - y(x1-h))/h; 
b2 = (y(x1)-2*y(x1-h)+y(x1-2*h))/(h.^2); 

% Relative Errors 

ForwardError1 = (f1 - dy(x1))/dy(x1); 
ForwardError2 = (f2 - ddy(x1))/ddy(x1); 

CentralError1 = (c1 - dy(x1))/dy(x1); 
CentralError2 = (c2 - ddy(x1))/ddy(x1); 

BackwardError1 = (b1 - dy(x1))/dy(x1); 
BackwardError2 = (b2 - ddy(x1))/ddy(x1); 

回答

1

你不需要循環。您可以使用meshgrid來創建所有參數的組合(在您的案例中爲xh),並將它們用作函數的輸入。

要獲得x = [0.5, 1.5]h=0.00001:0.00001:0.00007(我假設,因爲你沒有指定的問題h值)的組合,你會怎麼做:

[x, h] = meshgrid([0.5, 1.5], 0.00001:0.00001:0.00007); 
y = @(x) x.^3 - 5*x; 
f1 = (y(x1+h) - y(x1))./h; 

這裏x,h是尺寸7x2的矩陣,所以是結果f1。請注意,/已更改爲./,因爲h是矩陣,我們希望每個元素的操作。

+0

或者,除此之外,您可能希望將腳本編寫爲一個函數,該函數需要'x'和'h'的輸入。你可以通過函數定義返回6個輸出,如函數[ForwardError1,ForwardError2,CentralError1,CentralError2,BackwardError1,BackwardError2] = calc_my_errors(x,h)'(然後刪除全部清除)。請參閱[功能](https://uk.mathworks.com/help/matlab/ref/function.html)。 – Steve