Matlab GUI解方程项目
我有一个Matlab项目,其中我需要制作一个GUI,从用户那里接收两个数学函数。然后我需要找到它们的交点,然后绘制这两个函数 因此,我有几个问题:Matlab GUI解方程项目,matlab,user-interface,Matlab,User Interface,我有一个Matlab项目,其中我需要制作一个GUI,从用户那里接收两个数学函数。然后我需要找到它们的交点,然后绘制这两个函数 因此,我有几个问题: 你知道我可以用什么算法找到交点吗?当然,我更喜欢一个,我已经可以找到一个Matlab代码在互联网上。另外,我更喜欢的不是牛顿-拉斐逊方法。 我应该指出,我不允许使用内置的Matlab函数 我在绘制函数时遇到问题。我基本上是这样做的: fun_f = get(handles.Function_f,'string'); fun_g = get(h
fun_f = get(handles.Function_f,'string');
fun_g = get(handles.Function_g,'string');
cla % To clear axes when plotting new functions
ezplot(fun_f);
hold on
ezplot(fun_g);
axis ([-20 20 -10 10]);
log10(x)
,另一个函数设置为y=1
,则不会显示y=1
。
我已经尝试使用所有的axis命令,但没有效果。如果我自己设置限制,函数只存在于某些限制中。我不知道为什么
三,。如何在静态文本中显示数字?或者更好,用数字串?
我想显示类似x0=[root1];x1=[root2]
。我找到的唯一解决办法是将我找到的根转换成字符串,但我不愿意
至于方程求解器,这是我到目前为止的代码。我知道这很业余,但这似乎是最“直观”的方式。还要记住,它还没有完成(例如,它将只显示两个解决方案,我不太确定如何在一个静态文本中显示多个根,因为它们是字符串,因此问题#3)
函数[Sol]=解算方程(句柄)
fun_f=get(handles.Function_f,'string');
fun_g=get(handles.Function_g,'string');
f=内联(fun\u f);
g=内联(fun_g);
i=1;
Sol=0;
对于x=-10:0.1:10;
如果(g(x)-f(x))>=0&(g(x)-f(x))<0.01
Sol(i)=x;
i=i+1;
结束
结束
溶质1=num2str(溶质(1));
溶液2=num2str(溶胶(2));
集合(handles.roots1,'string',solution1);
集合(handles.roots2,'string',solution2);
if
条件是因为减法永远不会给我一个绝对零,这似乎在某种程度上解决了它,虽然它确实不完美,但有时它会给我两个以上非常相似的解(例如1.9和2)。
x
的范围是任意的,由我选择
我知道这是一个很长的问题,所以我非常感谢你的耐心。
提前非常感谢 问题1 我认为这是一种在离散点上寻找给定数据根的更稳健的方法。寻找函数之间的差异何时改变符号,对应于它们的交叉
S=sign(g(x)-f(x));
h=find(diff(S)~=0)
Sol=x(h);
如果你想在任何地方对函数进行求值,你可以使用更多的方法,但这取决于域的大小和你想要的精度,以及什么是最好的。例如,如果您不需要非常高的精度,那么f
和g
函数的计算非常简单,并且您不能或不想使用导数,您可以使用与第一个代码段相同的思想获得更精确的根,但要迭代执行:
G=inline('sin(x)');
F=inline('1');
g=vectorize(G);
f=vectorize(F);
tol=1e-9;
tic()
x = -2*pi:.001:pi;
S=sign(g(x)-f(x));
h=find(diff(S)~=0); % Find where two lines cross over
Sol=zeros(size(h));
Err=zeros(size(h));
if ~isempty(h) % There are some cross-over points
for i=1:length(h) % For each point, improve the approximation
xN=x(h(i):h(i)+1);
err=1;
while(abs(err)>tol) % Iteratively improve aproximation
S=sign(g(xN)-f(xN));
hF=find(diff(S)~=0);
xN=xN(hF:hF+1);
[~,I]=min(abs(f(xN)-g(xN)));
xG=xN(I);
err=f(xG)-g(xG);
xN=linspace(xN(1),xN(2),15);
end
Sol(i)=xG;
Err(i)=f(xG)-g(xG);
end
else % No crossover points - lines could meet at tangents
[h,I]=findpeaks(-abs(g(x)-f(x)));
Sol=x(I(abs(f(x(I))-g(x(I)))<1e-5));
Err=f(Sol)-g(Sol)
end
% We also have to check each endpoint
if abs(f(x(end))-g(x(end)))<tol && abs(Sol(end)-x(end))>1e-12
Sol=[Sol x(end)];
Err=[Err g(x(end))-f(x(end))];
end
if abs(f(x(1))-g(x(1)))<tol && abs(Sol(1)-x(1))>1e-12
Sol=[x(1) Sol];
Err=[g(x(1))-f(x(1)) Err];
end
toc()
Sol
Err
这将使绘制更加容易:
plot(x,f(x),'b',Sol,f(Sol),'ro',x,g(x),'k',Sol,G(Sol),'ro')
问题3
我不确定您为什么不想将根显示为字符串,这有什么问题:
text(xPos,yPos,['x0=' num2str(Sol(1))]);
你能举一个
f(x)
和g(x)
的例子吗?非常感谢!我将不得不研究你的代码,因为我不熟悉一些函数(比如linspace)。将我的根显示为字符串可能是个问题(我仍然不确定),因为我想在一个静态文本中显示“x0=sol(1);x1=sol(2)”,等等。。。(毕竟,这个方程可能有很多解)。我怎么做这样的事?一段时间还是一段时间?你认为你有更好的办法显示根吗,GUI方面的?关于你的评论(起初没有看到),f(x)和g(x)可以是任何东西,从多项式到sin、cos和log。幸运的是,我不需要导数。再次感谢你的代码。它近乎完美,但有一个问题。如果一个函数与另一个相切,则Sol矩阵将为空。例如,如果f=x^2+2x和g=-1,就会发生这种情况。或者f=sin(x)和g=1。这是一个棘手的问题。我已经编辑了我的答案,看看结果如何。
plot(x,f(x),'b',Sol,f(Sol),'ro',x,g(x),'k',Sol,G(Sol),'ro')
text(xPos,yPos,['x0=' num2str(Sol(1))]);