2014-12-02 67 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