2015-11-20 79 views
0

我正在嘗試使用MATLAB編寫一個小程序,其中嘗試區分我在不同函數中創建的函數,但是我不斷收到錯誤。使用MATLAB進行微分

我的文件有:

newton.m:

function [ y, iter ] = newton(f, fp, x0) 

    iter = 0; 
    xprev = x0; 
    x = xprev - f(xprev)/fp(xprev); 

    iter = iter + 1; 

    while abs(x-xprev) > eps*abs(x) 
     xprev = x; 
     x = x - f(x)/fp(x); 
     iter = iter + 1; 
     y = x; 
    end 
end 

FM:

function y = f(x) 
    y = tan(x) - 2*x; 
end 

fp.m:

function y = fp(f) 
    y = diff(f); 
end 

我運行了以下內容:

[y, iter] = newton(@f, @fp, 1.4) 

並獲得:

Error using /
Matrix dimensions must agree.

Error in newton (line 6) x = xprev - f(xprev)/fp(xprev);

當我檢查的y在fp.m我不斷收到[]值。

+0

函數'diff'返回向量中元素之間的差異。見diff>。你需要在調用'fp' –

回答

1

您正在嘗試使用diff來區分功能。開箱即用的diff在元素對之間執行差異操作。你不想要這個。相反,請將您的ffp作爲實際功能句柄。首先創建你的函數f象徵定義,然後使用diff符號版本(你可以用diff自稱)區分這種符號表示,然後用matlabFunction創建一個MATLAB函數出這一點:

%// Define symbolic variable 
syms x; 

%// Define function symbolically 
y = tan(x) - 2*x; 

%// Define function handles (numerical) to the original and derivative 
f = matlabFunction(y); 
fp = matlabFunction(diff(y)); 

%// Now call Newton's Method 
[y, iter] = newton(f, fp, 1.4); 

請注意,ffp已經是功能句柄。這就是matlabFunction返回的結果,因此不再需要通過@創建一個句柄作爲牛頓方法函數的輸入了。

運行這個修改你的代碼,我得到這個在x = 1.4與最初的猜測根和迭代的花費金額:

>> format long g 
>> y 

y = 

      1.16556118520721 

>> iter 

iter = 

    8 

如果符號數學工具箱丟失..

如果由於某種原因,你沒有符號數學工具箱,那麼我建議不起作用。因此,您沒有選擇,只能使用衍生的離散近似來實現此功能。但是,我們仍然可以使用上面編寫的代碼,但fp必須以不同的方式定義。

如果你還記得,導數的定義是這樣的:

爲了得到這個在離散的情況下工作,你做Δx非常小的...像1e-10例如。

這樣,你會用匿名函數做到這一點,而不是:

%// Define function 
f = @(x) tan(x) - 2*x; 

%// Define derivative 
h = 1e-10; 
fp = @(x) (f(x + h) - f(x))/h; 

%// Now call Newton's Method 
[y, iter] = newton(f, fp, 1.4); 

有了這個,我得到:

>> format long g; 
>> y 

y = 

      1.16556118520721 

>> iter 

iter = 

    8 

我會說那是相當的接近!

+0

時至少得到兩個值謝謝你的答案!我想我錯過了一些東西。我是否需要在命令窗口中創建函數f的符號定義或作爲新的'm'文件? – Buzi

+0

@Buzi不,您不需要爲原始函數及其派生文件創建一個新的M文件。你直接在代碼中創建你的函數句柄。只需將我上面寫的代碼放入一個新的M文件並運行即可。我得到它運行,這就是我得到我的答案。順便說一句,當你得到這個工作,如果你不需要任何幫助,考慮接受我的答案,向SO社區表明你不需要更多的幫助。祝你好運! – rayryeng

+0

我應該使用特定名稱來調用新的M文件嗎?當然,我會將你的答案標記爲有用:) – Buzi