2

我有一个符号函数,我特别想知道它的零点。我通过谷歌搜索,试图找到与我的查询相关的东西,但没有成功。

有人可以帮我吗?

编辑:

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 个术语。

我在做什么对任何人来说都是错的吗?如果有更好的方法,有人可以推荐吗?

4

2 回答 2

2

假设至少有一个根是真实的和正的,与您的时间相对应,您看到虚构的根就不会感到惊讶。问题是由于您所做的近似,时间是否有意义。您是否绘制了实际函数以获得零位置的粗略近似值?

我无法真正评论您要解决的特定问题。您需要确保您使用了足够多的泰勒展开项,并且它们对于域是准确的。您是否尝试过将其留在expand/or中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通常是安全的,因为会被认为是这样的。但是,由于操作顺序,在转换为符号之前以浮点计算。一般来说,您应该在符号表达式中使用或。tpipi^2sym('pi')sym(pi)

于 2014-05-21T19:24:08.700 回答
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 平面上的函数值)。

于 2014-05-21T01:40:50.900 回答