代码之家  ›  专栏  ›  技术社区  ›  pred

如何将向量指定给符号表达式或函数句柄?

  •  1
  • pred  · 技术社区  · 7 年前
    clear all
    clc
    k=1;
    z3=[0.21,0.132,0.094,0.073,0.0601,0.0509];
    b3=[4.7293,7.8532,10.9912,14.1372,17.2788,20.4204];
    syms x
    a=1/(4*b3(k)^3*(1-cosh(b3(k))*cos(b3(k))));
    t1=sinh(b3(k)*x)+sin(b3(k)*x);
    t2=cosh(b3(k)*x)+cos(b3(k)*x);
    % first part of green function 
    s1=subs(t1,x,(1-z3(k)));
    s2=subs(t2,x,(1-z3(k)));
    m1=(cosh(b3(k))-cos(b3(k)))*((t1*s2)+(t2*s1));
    m2=sinh(b3(k))*((t1*s1)+(t2*s2));
    m3=sin(b3(k))*((t1*s1)-(t2*s2));
    w1=a*(m1-m2-m3);
    w1= matlabFunction(w1)
    % second part of green function 
    s3=subs(t1,x,z3(k));
    s4=subs(t1,x,(1-x));
    s5=subs(t2,x,z3(k));
    s6=subs(t2,x,(1-x));
    n1=(cosh(b3(k))-cos(b3(k)))*((s3*s6)+(s5*s4));
    n2=sinh(b3(k))*((s3*s4)+(s5*s6));
    n3=sin(b3(k))*((s3*s4)-(s5*s6));
    w2=a*(n1-n2-n3);
    w2= matlabFunction(w2)
    x=0:0.01:1;
    c=0:0.01:1;
    for i=1:length(x)
        if (x(i)<=z3(k))
            w(i)=w1;
            % below is the second half of the green function
        elseif (x(i)>=z3(k))
            w(i)=w2;
        end
    end
    plot(x,w)
    

    我得到了一个符号表达式,我想给x赋值,x是一个向量, 然后提取“w”,它是一个分段的。我发现解决这个问题有些困难。“不允许函数句柄的非标量数组”是我遇到的错误。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Robert Seifert    7 年前

    第一 w1 w2 不是符号表达式,而是普通的匿名函数句柄。因此,我猜您只想插入 x(i) 进入 w1级 w2级 ,是吗?

    第二,排队 x=0:0.01:1; 您正在创建一个双精度数组 x 并覆盖先前定义的符号变量 syms x ,它后来成为符号句柄的函数参数。在这种情况下,什么都没有发生,但我建议重命名向量。

    X=0:0.01:1;
    for ii=1:length(xX)
        if (X(ii)<=z3(k))
            w(ii) = w1(X(ii));
            % below is the second half of the green function
        elseif (x(ii)>=z3(k))
            w(ii)=w2(X(ii));
        end
    
    end
    

    enter image description here

    在将句柄分配给之前 w ,这将需要一个单元格数组。但我怀疑你想要那样。