2014-12-02 65 views
0

我使用Matlab來查找非線性函數的根。該公式是漫長的,我已經用另一種.m保存功能,它的代碼是這樣使用Matlab的非線性方程的根

function x_c = f_x_c(s,H,VA,Lo,qc,EA,NF,Sj,Fj) 

if (s < 0) || (s > Lo); 
    disp('The value of s is invalid') 
    disp(['s = ' num2str(s)]); 
    return 
end 

C1 = H/qc; 
if NF == 0 
    n = 0; 
    sn = 0; 
    sum_Fj = 0; 
end 
if NF >= 1 
    Sj_Q = [0; Sj; Lo]; 
    %Determine n and sn if 0 <= s < Lo: 
    if s < Lo 
    STOP = 0; 
    k = 0; 
     while STOP == 0 
     k = k + 1; 
      if (s >= Sj_Q(k,1)) && (s < Sj_Q((k + 1),1)) 
      STOP = 1; 
      end 
     end 
    n = k - 1; 
    sn = Sj_Q(k,1); 
    end 

    %Determine n and sn if s = Lo: 
    if s == Lo 
     n = NF; 
     sn = Sj(NF,1); 
    end 

sum_Fj = sum(Fj(1:n,1)); 
end 


x_c = (H/EA)*s; 
x_c = x_c + C1*asinh((qc*s - VA + sum_Fj)/H) + ... 
- C1*asinh((qc*sn - VA + sum_Fj)/H); 

for j = 1:n 
    sk = Sj_Q((j + 1),1); 
    sk_1 = Sj_Q(j,1); 
    sum_Fj = sum(Fj(1:(j - 1))); 
    x_c = x_c + ... 
    + C1*asinh((qc*sk - VA + sum_Fj)/H) + ... 
    - C1*asinh((qc*sk_1 - VA + sum_Fj)/H); 
end 

變量是H這裏。代碼沒有問題,因爲當我在主文件中輸入以下內容時,它會返回那個冗長的等式。

syms x 
equation = -(XB - XA) + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj); %Replaced H with variable H and all other arguments are pre-defined 

現在,我要解決近H0這個方程。當我把fzero(@(x)equation, H0),它給了我出外

Undefined function 'isfinite' for input arguments of type 'sym'. 

Error in fzero (line 308) 
    elseif ~isfinite(fx) || ~isreal(fx) 

Error in main (line 50) 
fzero(@(x)equation, H0) 

錯誤我怎樣才能解決這個問題?

編輯:

方程至少有一個根,因爲如果我用ezplot繪製功能,我得到如下圖所示。 enter image description here

+0

@patrik不,我沒有任何這樣的變量。實際上,在'fzero.m'中,有一行有'isfinite'。該行如 '如果有(〜isfinite([fa fb]))||任何(〜isreal([fa fb]))' – 2014-12-02 08:37:23

+0

對不起,我的壞。但是,我試圖用更簡單的函數重現錯誤,但是我目前無法重現錯誤。行'函數x_c = equation = XB -XA + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj);'也不可運行。我能問你想做什麼嗎?你有一個函數文件,需要一個輸入,並給出一個輸出,你想找到的根? – patrik 2014-12-02 08:51:12

+0

@patrik 是的,Sj和Fj應該是函數中的矩陣,這就是爲什麼你的代碼可能沒有運行。 代碼太大了!你想讓我在這裏發佈整個事情嗎? – 2014-12-02 08:54:23

回答

0

我明白了,我到了和你幾乎一樣的地方,但是我得到了309行,因爲在上明顯使用isfinite不會導致matlab 2014b崩潰。但是,isfinite返回false,仍然出現錯誤。但是要指出的是:fzero似乎並不是用於符號的。你確定符號在這裏是必要的嗎?看看函數調用它似乎並不需要,因爲輸出看起來好像它應該是一個數字無論如何。你也可能會爭辯說

syms x; fzero(@(x) x^2-1,1) 

作品,但隨後在@(x)將x具有更高的優先級是不是一個符號(在編程中,我們說的變量有不同的範圍)。

如果重要的是xsym,您應該使用方程式求解器solve,而不是用於符號輸出。

syms x; 
equation = x^2-3; 
solve(equation,'x') 

然而,這可能會失敗,或者給你複雜的功能超長的答案(也爲沒有好的分數答案表達式嘗試syms x; equation = x^3-3.17+1.37*x;)。如果在表達式中沒有任意的常量(例如,f = x^2-a < => x = + - a ^(1/2),其中a要被定義以後或者你想對某個解決方案做多個值)。

0

我不知道是什麼導致了這個問題,因爲我不熟悉Matlab中的符號包。

然而,你應該能夠使用一些數值解算器相當容易地解決它。從我所能讀取的代碼中,您想要解決上述等式爲零的問題,這正是牛頓Rhapson正在做的。你可以在這裏查看這個方法:http://en.wikipedia.org/wiki/Newton's_method

因爲你可能不知道函數的確切導數,你可以使用一階近似來估計它,在這裏你只需使用差分定義,但是因爲我們不能讓h去0,我們選擇h非常小,在matlab中,我通常使用sqrt(eps)。因此近似值變爲:f'(x)=(f(x + sqrt(eps)) - f(x))/ sqrt(eps)。

否則,你可以用我的方法,這在一維的作品,你可以在這裏找到:http://imada.sdu.dk/~nmatt11/MM533-2014/ 您必須下載fpisimple.m和mynewton.m如牛頓法就是固定點迭代的應用是構建最重要的是。

+0

它不起作用。可見我這個錯誤: '使用符號/的subsref錯誤(9號線)使用maplemex 錯誤 錯誤,(在MTM:-subsref)指數必須是正整數,得到229396153.846153855 錯誤mynewton> @( x)xf(x)/ fprime(x)(line 8) g = @(x)x -f(x)/ fprime(x) fpisimple中的錯誤(第9行) x = f(x); mynewton中的錯誤(第11行) x = fpisimple(g,x0,tol); 主錯誤(第51行) mynewton(equation,H0,100)' – 2014-12-02 09:04:39