Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab GUI解方程项目_Matlab_User Interface - Fatal编程技术网

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

我有一个Matlab项目,其中我需要制作一个GUI,从用户那里接收两个数学函数。然后我需要找到它们的交点,然后绘制这两个函数

因此,我有几个问题:

  • 你知道我可以用什么算法找到交点吗?当然,我更喜欢一个,我已经可以找到一个Matlab代码在互联网上。另外,我更喜欢的不是牛顿-拉斐逊方法。 我应该指出,我不允许使用内置的Matlab函数

  • 我在绘制函数时遇到问题。我基本上是这样做的:

    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))]);