如何绘制通过牛顿法评估函数得出的几个数据点

时间:2019-05-08 12:25:36

标签: python loops math graph sage

当x不等于y时,我试图通过使用牛顿法来近似x ^ y = y ^ x的值来收集多个数据点。我在寻找如何在y的几个不同固定值上评估函数(通过牛顿方法)时遇到问题。完成此操作后,我旨在将所得的(x,y)坐标点存储在列表中,然后将它们绘制为一条线。 这是到目前为止我整理的一些代码示例。

(请耐心等待,因为我缺乏编码技能,我刚刚开始学习使用鼠尾草,经过数小时的研究,我为使这项工作而付出的努力使我来到了这里。)

x=var('x');
y = ? '''(Some varying list of numbers between 1 and 100 at increments of 0.1. 
I am not sure how represent this with code.)'''
f(x)=x^(y/x)
df=diff(f,x);
NewtonIt (x)=x-(f/df) (x);

#### this is the for loop I was playing around with
'''xn=1.5;
print xn;
for i in range(5):
xn=N(NewtonIt(xn),digits=20)
print xn;'''

#### this is the while loop that I am leaning towards using
x0=2; 
print x0
x1=N(NewtonIt(x0),digits=25)
print x1;
while abs (x0-x1)>10^(-25):
x0=x1
x1=N(NewtonIt(x0),digits=25)
print(x1);      

在这一点上,我被困住了,我已经研究了如何存储数据,但无济于事。我找到了一些用于从数据点绘制线的基本代码,但是我不确定如何将数据点存储在列表中,然后将列出的点放入线图函数中。我猜想从一组数据点绘制结果行的代码看起来像下面的代码。

line([(x0,y0),(x1,y1),....(xn,yn)], legend_label='Approximation of x^y=y^x');

我觉得我定义为f(x)的方程式可能不是解决该问题的理想方法。任何关于使用什么的见解都会受到赞赏,但我的目的是开发可以循环数千次迭代并创建可以轻松绘制在2D图形上的数据点的代码。

对于这个问题的任何帮助或见解将不胜感激。另外,对于我对sagemath和python的雏形理解,我深表歉意,并希望您代表我考虑这个问题。

1 个答案:

答案 0 :(得分:0)

微积分的经典牛顿法通常与一个变量的函数一起使用。那不是你在做什么。您应该选择一个特定的y,然后使用牛顿方法找到某个函数的。在这种情况下,x^y-y^x(对于常数y)可能会起作用。这是一个示例,说明如何在Sage中使用它。

var('y')
g(x) = x^y-y^x

def find_point(y):
    f = g.subs(y=y)
    fp = diff(f,x)
    NewtonIteration(x) = x - (f/fp)(x)
    x1 = 2
    x2 = N(NewtonIteration(x1))
    while abs(x2-x1) > 10^-10:
        x1 = x2
        x2 = N(NewtonIteration(x1))

    return (x1,y)

L = [2,3,4,5,6]
[find_point(l) for l in L]

然后,您实际上可以将line()与您创建的任何列表一起使用。例如,您可以将其命名为M = [find_point(l) for l in L],然后执行line(M)Here is a similar live example.

最后,看来您正在使用this website中的某个东西,碰巧有多余的分号。您可能更喜欢this one(我刚刚从中复制),或者更喜欢this one from the Sage wiki作为模型。