如何使用fsolve
函数(来自scilab
)在下面显示的图形中找到交点?
这是我到目前为止尝试过的:
function y=f(x)
y = 30 + 0 * x;
endfunction
function y= g(x)
y=zeros(x)
k1 = find(x >= 5 & x <= 11);
if k1<>[] then
y(k1)= -59.535905 +24.763399*x(k1) -3.135727*x(k1)^2+0.1288967*x(k1)^3;
end;
k2=find(x >= 11 & x <= 12);
if k2 <> [] then
y(k2)=1023.4465 - 270.59543 * x(k2) + 23.715076 * x(k2)^2 - 0.684764 * x(k2)^3;
end;
k3 = find(x >= 12 & x <= 17);
if k3 <> [] then
y(k3) =-307.31448 + 62.094807 *x(k3) - 4.0091108 * x(k3)^2 + 0.0853523 * x(k3)^3;
end;
k4 = find(x >= 17 & x <= 50);
if k4 <> [] then
y(k4) = 161.42601 - 20.624104 *x(k4) + 0.8567075 * x(k4)^2 - 0.0100559 * x(k4)^3;
end;
endfunction
t=[5:50];
plot(t, g(t));
plot2d(t, f(t));
deff('res = fct', ['res(1) = f(x)'; 'res(2) = g(x)']);
k1=[5, 45];
xsol1 = fsolve(k1, f, g)
答案 0 :(得分:0)
您的原始帖子完全不可读且混乱。我花了一些时间来编辑它并了解您要达到的目标。但是,我会尽力帮助您。让我们一步一步走吧:
find
函数。可能您是在尝试对g
函数进行向量化?请注意,默认情况下,Scilab不会通过数组广播功能。您需要对其向量化,或使用feval
进行向量化。请阅读我之前写过的this other answer。 find
是应用于数组,布尔运算和标量的向量化运算,查找满足该运算的数组元素。例如来自the find
page:beers = ["Desperados", "Leffe", "Kronenbourg", "Heineken"];
find(beers == "Leffe")
返回2
和
A = rand(1, 20);
w = find(A < 0.4)
返回小于A
的数组0.4
的那些元素。
if, then, elsif, else, end
语句。如果您了解了这一点,则不会以这种方式使用find
函数。有时您连续有很多if
,然后尝试改用select, case, else, end
。您的第二个功能可以写成:function y = g(x)
if x < 5 | 50 < x then
error("Out of range");
elseif x <= 11 then
y = -59.535905 + 24.763399 * x - 3.135727 * x^2 + 0.1288967 * x^3;
return;
elseif x <= 12 then
y = 1023.4465 - 270.59543 * x + 23.715076 * x^2 - 0.684764 * x^3;
return;
elseif x <= 17 then
y = -307.31448 + 62.094807 * x - 4.0091108 * x^2 + 0.0853523 * x^3;
return;
else
y = 161.42601 - 20.624104 * x + 0.8567075 * x^2 - 0.0100559 * x^3;
end
endfunction
30
的点。尽管有一些方法可以自动找到这些点,但对找到合适的范围很有帮助:t = [5:50];
plot(t, feval(t, g) - 30)
表明这两个解决方案在20 < x1 < 30
和40 < x < 50
的范围内。
fsolve
与正确的初始值一起使用,则可以得到很好的结果:--> deff('[y] = g2(x)', 'y = g(x) - 30');
--> fsolve([25; 45], g2)
ans =
26.67373
48.396547
fsolve
函数的第三个参数是g(x)
函数的Jacobin /导数。您应该手动计算上述多项式的导数(或使用像Maxima这样的合适的符号软件),或者使用poly
函数将它们定义为多项式。例如,请参见this tutorial。然后区分它们,定义一个新函数,例如dgdx
。