Почему работает код Python, но при использовании уравнения вывод не выводится? - PullRequest
1 голос
/ 31 октября 2019

Я написал код, который отлично работает для численного решения уравнений, но есть одно конкретное уравнение, которое, когда я попадаю туда и пытаюсь запустить код - оно будет работать, и никакой выходной информации никогда не будет!

Уравнение Я получил выход для: x ^ 3-3 * x + 2-a * (np.sin (x))

Уравнение, для которого я не получил выход: (x-1) (x-2) (x-3) -a * (np.cos (x))

Я также попытался написать второе уравнение без скобок, например:x ^ 3-6 * x ^ 2 + 11 * x-6-a * np.cos (x)

и это не помогло. в чем проблема?!

это мой код:

import math
import numpy as np
h =1e-5
eps =1e-8
#function of the equation
def nf(x,a,c):
    c=math.cos(x)
    solu=(x-1)*(x-2)*(x-3)-a*c
    return(solu)
#numerical method
def sl(a,x):
    c=math.cos(x)    
    f = nf(x,a,c)
    while abs(f)>eps:
        x = x - h*f/(nf(x+h,a,c)-f)
        f = nf(x,a,c)
    return(x)

N = 101
mya = np.linspace(0.0,1.0,N)
myb = np.zeros(mya.shape)
myc = np.zeros(mya.shape)
myd = np.zeros(mya.shape)
for i in range(0,N):
    myb[i] = sl(mya[i],1.0)
    myc[i] = sl(mya[i],2.0)
    myd[i] = sl(mya[i],3.0)

print(myb[i])
print(myc[i])
print(myd[i])

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Ваша функция nf была немного странной. Вы передавали c = math.cos(x) в nf (), но с помощью nf () вы пытались назначить c to math.cos(x) снова. Просто используйте значение c, которое вы передали. Комментирование этого исправляет ваш код. Что касается математической правильности, я не могу определить это, если вы не предоставите более точное объяснение того, что вы пытаетесь сделать.

import math
import numpy as np
h =1e-5
eps =1e-8
#function of the equation
def nf(x,a,c): 
    # this line is not needed. Commenting allows your code to run   
#     c=math.cos(x)
    solu=(x-1)*(x-2)*(x-3)-a*c
    return(solu)
#numerical method
def sl(a,x):  
    c = math.cos(x)
    f = nf(x,a,c)
    while abs(f)>eps:
        x = x - h*f/(nf(x+h,a,c)-f)
        f = nf(x,a,c)
    return(x)

N = 101
mya = np.linspace(0.0,1.0,N)
myb = np.zeros(mya.shape)
myc = np.zeros(mya.shape)
myd = np.zeros(mya.shape)
for i in range(0,N):
    myb[i] = sl(mya[i],1.0)
    myc[i] = sl(mya[i],2.0)
    myd[i] = sl(mya[i],3.0)

print(myb[i])
print(myc[i])
print(myd[i])

Вывод:

3.2036907284
0.835006605064
0.677633820877
0 голосов
/ 31 октября 2019

Проблема в том, что для некоторого ввода в sl, abs(f)>eps может никогда не стать False, создавая бесконечный цикл. Я не исследовал вашу математическую проблему, поэтому не могу решить эту проблему «по-настоящему». То, что я могу предоставить, - это автоматическое определение того, когда это происходит, так что код возвращается без результата, а не зацикливается навсегда.

def sl(a,x):
    c=math.cos(x)    
    f = nf(x,a,c)
    count, maxcount = 0, 1000
    while abs(f)>eps:
        x = x - h*f/(nf(x+h,a,c)-f)
        f = nf(x,a,c)
        count += 1
        if count > maxcount:
            return
    return(x)

Здесь разрешается максимум 1000 итераций, прежде чем решение считаетсянедостижим. В таком случае sl возвращает None, который при вставке в ваши массивы NumPy float становится np.nan.

При исследовании выходных данных только myc[60] завершается сбоем таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...