Matlab查找符号函数的零点

时间:2014-05-20 21:58:50

标签: matlab function zero polynomials

我有一个符号功能,我特别感兴趣的是零。我搜索了谷歌,试图找到与我的查询相关的东西,但没有成功。

有人可以帮助我吗?

编辑:

T(x,t) = 72/((2*n+1)^2*pi^3)*(1 - (2*n+1)^2*pi^2*t/45 + (2*n+1)^4*pi^4*t^2/(2*45^2) - (2*n+1)^6*pi^6*t^3/(6*45^3))*(2*n+1)*pi*x/3;

for i=1:1:1000
    T_new = 72/((2*i+1)^2*pi^3)*(1 - (2*i+1)^2*pi^2*t/45 + (2*i+1)^4*pi^4*t^2/(2*45^2) - (2*i+1)^6*pi^6*t^3/(6*45^3))*(2*i+1)*pi*x/3;

    T = T + T_new;

end

T = T - 72/((2*n+1)^2*pi^3)*(1 - (2*n+1)^2*pi^2*t/45 + (2*n+1)^4*pi^4*t^2/(2*45^2) - (2*n+1)^6*pi^6*t^3/(6*45^3))*(2*n+1)*pi*x/3;

T = T(1.5,t);

T_EQ = 0.00001

S = solve(T - T_EQ == 0,t);

我得到的问题是S是一个包含虚数的向量。我期待一个真实的数字,因为我想计算一个时间。

以下是关于我要做的事情的一些背景知识:

http://hans.math.upenn.edu/~deturck/m241/solving_the_heat_eqn.pdf

在给定的链接中,针对特定的一维情况求解了热方程。我相信,满足规定边界和初始条件的温度分布见第50页。

我想要做的是找到一维物体与环境平衡的时间,环境保持在T = 0的恒定温度。据我所知,最简单的方法是使用指数函数的泰勒展开式,仅使用前几个项,因为我预计平衡时间相对较短;然后使用小角度近似法来表示正弦函数,因为杆的长度相对较小。做到这一点,我做了一个for循环来生成项,就像求和函数一样 - 正如你所看到的,我使用了1000个术语。

我所做的事情对任何人来说都是错误的吗?如果有更好的方法,有人可以推荐吗?

2 个答案:

答案 0 :(得分:2)

如果至少有一个根是真实的,并且与你的时间相对应,你应该不会感到惊讶。问题是,由于你所做的近似,时间是否有意义。您是否绘制了实际函数以获得零点的粗略近似值?

我无法评论您要解决的特定问题。您需要确保使用足够的泰勒扩展术语,以确保它们对于域名是准确的。您是否尝试过此exp和/或sin?你有什么理由不能使用零吗?你有没有检查过你的总和在1000个学期之后收敛了?或者它会更快收敛还是根本不收敛?

主要问题是你为什么要使用符号数学来解决这个问题?这似乎是一个数字问题,除非您在求和中遇到溢出/下溢问题。在这种情况下,您可以使用fzero找到零:

N = 32;  % Number of terms in summation
x = 1.5;
T_EQ = 1e-5;
n = (2*(0:N)+1)*pi;
T = @(t)sum((72./n.^3).*exp(-n.^2*t/45).*sin(n*x/3))-T_EQ;
S = fzero(T,[0 1e3]) % Bounds around a root guarantees solution if function monotonic

返回

S =

  56.333877640358708

如果您要使用solve,我会执行以下操作以避免for循环:

syms t
N = 32;
x = 1.5;
T_EQ = 1e-5;
n = (2*sym(0:N)+1)*sym(pi);
T(t) = sum((72./n.^3).*exp(-n.^2*t/45).*sin(n*x/3));
S = double(solve(T-T_EQ==0,t))

或使用symsum

syms n t
N = 32;
x = 1.5;
T_EQ = 1e-5;
T(t) = symsum((72/(pi*(2*n+1))^3)*exp(-(pi*(2*n+1))^2*t/45)*sin(pi*(2*n+1)*x/3),n,0,N);
S = double(solve(T-T_EQ==0,t))

最后,您的符号解决方案甚至不准确,因为您的pi个变量正在被转换为有理近似值。 pi是浮点数。如果pi*t具有象征性,t之类的内容通常是安全的,因为pi会被识别出来。但是,由于操作顺序,pi^2在转换为符号之前以浮点计算。通常,您应该在符号表达式中使用sym('pi')sym(pi)

答案 1 :(得分:1)

假设你有x或y的多项式或三角函数,你的意思是"零"是函数与轴交叉的值,即x或y为零,当变量为0时,可以调用函数的值。例如:

syms x y
f=-cos(x)*exp(-(x^2)/40);
ezsurf(f,[-10,10])

F=matlabFunction(f,'vars',{[x]});
F([0])

ezsurf只是想象了情节。如果你想要x和y的函数,你可以执行以下操作:

syms x y
f=-cos(x)*cos(y)*exp(-(x^2+y^2)/40);
ezsurf(f,[-10,10])

F=matlabFunction(f,'vars',{[x,y]});
for y=0
    solve(f)
end

这将给出函数的值,其中x的整数倍对应于y的零点(y = 0平面上函数的值)。