如何使用 fsolve 绘制函数的解?

问题描述 投票:0回答:1

我有一个变量 a 等于 (weight./(1360*pi)).^(1/3),其中重量范围在 4 到 8kg 之间。

然后我猜测所用时间为 14400 秒。

附上有问题的函数,其中无穷大被k=22代替。 Function in question 这个函数应该等于 57/80

r/a可以换成0.464,意思是求和的乘法可以写成2/(0.464*pi)。

alpha 将等于 0.7*10^-7

对于给定范围内的重量,我如何能够绘制出大众在数小时内做饭所花费的时间?

我已经尝试编写此功能几天了,但由于数组大小问题和一般功能无法正常工作,它似乎无法正常工作。

任何帮助将不胜感激:)

function matlab matlab-figure
1个回答
0
投票

首先,您需要一个主方程作为权重和 t 的函数,您希望 fsolve 找到它的零。然后对于每个权重,您可以在另一个函数中捕获它,然后求解 t:

alpha = 0.7e-7;
rbya = 0.464;
k = 1:22;
a = @(weight)(weight./(1360*pi)).^(1/3);
eqn = @(weight,t)2/pi/rbya*sum((-1).^(k-1)./k.*sin(k*pi*rbya).*exp(-1.*k.^2.*pi^2.*alpha.*t./(a(weight).^2)))-57/80;

weights = 4:8;
ts = zeros(size(weights));
for i = 1:numel(weights)
    sub_eqn = @(t)eqn(weights(i),t);
    ts(i)=fsolve(sub_eqn,14400);
end

plot(weights,ts/(60*60))
xlabel("Weight (kg)")
ylabel("Cooking Time (hrs)")

如果你想一次求解整个方程组,那么你需要注意数组的大小(正如你所经历的,阅读更多here)。 K 应该是一个列向量,这样

sum
将对列求和,而
weights
应该是一个行向量,这样逐元素操作将为每个权重重复
k
。您还需要您的初始猜测列表与
weight
大小相同,以便
fsolve
可以对每个权重进行猜测:

alpha = 0.7e-7;
rbya = 0.464;
k = (1:22)';

a = @(weight)(weight./(1360*pi)).^(1/3);

weights = 4:8;
eqn = @(t)2/pi/rbya*sum((-1).^(k-1)./k.*sin(k*pi*rbya).*exp(-1.*k.^2.*pi^2.*alpha.*t./(a(weights).^2)))-57/80;

ts=fsolve(eqn,repmat(14400,size(weights)));

plot(weights,ts/(60*60))
xlabel("Weight (kg)")
ylabel("Cooking Time (hrs)")

请注意,您使用这两种方法得到的答案确实略有不同。

© www.soinside.com 2019 - 2024. All rights reserved.