2017-05-20 56 views
0

这个问题是为了学习的目的。我写我自己的函数来绘制一个方程。例如:绘制两个变量函数

function e(x) { return sin(x); } 
plot(e); 

我写了一个函数作为参数的绘图函数。绘图代码很简单,x从某个值运行到某个值,然后小步增加。这是plot()设法产生的阴谋。

enter image description here

但有问题。它不能表达如下的圆方程:x + y = 1.所以问题是如何绘图和方程函数看起来能够处理两个变量。

注意到我不仅对两个圆方程感兴趣。用两个变量绘制函数的更一般化的方法。

+0

你正在使用哪种编程语言? –

+0

您必须为一个值求解方程。例如:'x²+y²= 1'相当于'y = sqrt(x²+ 1)'。通过简单地插入一个变量的值然后求解方程式,这可能更容易实现。可能更棘手的是,对于一个“x”,方程的大部分部分都有两个“y”值。 – Paul

+0

@SardarUsama,我使用Canvas和Javascript,但我只需要算法或正确的指针来解决问题。 – invisal

回答

1

函数的定义:函数f取一个输入x,并返回一个单独的输出f(x)。

现在它意味着任何输入都会有唯一一个唯一的输出。像y = sin(x)。这是一个功能xy definnes功能。

等于(x*x) + (y*y) = 1。对于单个值x,有两个可能的值y,因此它不能被称为函数的有效均衡。

如果你需要绘制它,然后一个可行的办法是积两分的x一个值,即sqrt(1-(x*x))-1*sqrt(1-(x*x))。绘制这两个值(其中一个将是正值,另一个值是负值,具有相同的绝对值)。

+0

但让我们说这两个变量函数变得更加复杂。像y^3 + y^2 = x^2 + 2 – invisal

+0

您将需要一种方法来解决y的值,以便您可以获得x的所有可能值。那么你将不得不为每个对应点绘制相同的x和不同的y值。 –

+0

可能你可以看到http://algebra.js.org你需要解决的一些方法x,那么你需要绘制这些值 –

1

嘛积非功能1D式(x,y变量),你有3种选择:

  1. 转化为参数形式

    因此,例如x^2 + y^2 = 1将变为:

    x = cos(t); 
    y = sin(t); 
    t = <0,2*PI> 
    

    因此,将每个函数绘制为1D函数绘图,而将t用作p arameter。但为此,你需要利用数学身份并替代......这不是容易完成的程序设计。

  2. 转换到1D功能

    非功能意味着你对某些x值有超过1y值。如果将公式分解为间隔并划分为覆盖整个图的所有情况,则可以改为绘制每个派生函数。

    所以你得到y algebraicaly(我们再次假设单位圆):

    x^2 + y^2 = 1 
    y^2 = 1 - x^2 
    y = +/- sqrt (1 - x^2) 
    ---------------------- 
    y1 = +sqrt (1 - x^2) 
    y2 = -sqrt (1 - x^2) 
    x = <-1,+1> 
    

    这也是不容易做到programaticaly,但它是一个数量级比#1容易。

  3. 做用方程2D情节一样谓词

    只是循环您的观点通过所有像素并呈现只有那些其公式是正确的。如此反复单位圆:

    for (x=-1.0;x<=+1.0;x+=0.001) 
    for (y=-1.0;y<=+1.0;y+=0.001) 
        if (fabs((x*x)+(y*y)-1.0)<=1e-6) 
        plot_pixel(x,y,some_color); // x,y should be rescaled and offset to the actual plot view 
    

    所以,你只是你的公式转换为隐形式:

    x^2 + y^2 = 1 
    ----------------- 
    x^2 + y^2 - 1 = 0 
    

    ,并与一些阈值进行比较,以零(为了避免FPU精度问题):

    | x^2 + y^2 - 1 | <= threshold_near_zero 
    

    阈值是绘图线宽度的一半。因此,通过这种方式,您可以轻松地将绘图宽度更改为任意像素大小......正如您所看到的,这很容易完成,但由于需要遍历绘图视图的所有像素,因此绘图较慢。 x,yfor循环的步骤应该匹配视图比例的像素大小。

    此外,虽然使用方程作为谓词,你应该处理数学奇点,因为盲目探测你很可能会碰到一些像划分零,域错误asin,acos,sqrt等。

所以对于任意1D非功能使用#3。除非你有一些强大的符号数学引擎#1#2