G
G
Gleb2020-09-29 21:02:36
Python
Gleb, 2020-09-29 21:02:36

1) Why are the graphs different? 2) Is there a function to write an element to an array in a loop?

Part 1 of the question, I solved the equation with an exact and numerical method, checked it on Wolfram, then compiled and expressed the recursive equation (replacement: y'' with the central derivative), did not forget about the initial conditions. The solutions turn out to be correct, but the graphs do not overlap with each other as the accuracy N increases. Why? Is the error somewhere in the code or with what?

Part 2 of the question, is there a nicer way to fill the arrays oX, oY1, oY2? it's not very convenient to copy values ​​from the console and paste them into arrays, maybe you can use some function? How, for example, from data frame to R?

import math as m
import matplotlib.pyplot as plt

# y'' + 4y = 4 / sin(2x);    y(pi/4) = 2 ; y'(pi/4) = pi

def f(x):
    # Точное реш.
    return (m.log(m.fabs(m.sin(2*x))) + 2)*m.sin(2*x) + (-2*x)*m.cos(2*x)

def fn(x):
    # неоднородность
    return 4/m.sin(2*x)

N = 100
h = 1/N

i = 0

x = m.pi/4

u:float; u1:float; u0: float
u0 = 2; u1 = m.pi*h + 2

while i < N:
    u2 = fn(x) * pow(h,2) - 2*u1 * (2*pow(h,2) - 1) - u0    # u2 mean U_(n+1) , где в скобках индексы
    x += h                                                  # u1 mean U_n
    i += 1                                                  # u0 mean U_(n-1)
    # print(i,'U(n)=', u2,'y(x)=', f(x))
    # print(u2, ',')
    # print(i * h, ',')
    print(f(x), ',')

# Берем первых 20 знач. из цикла

oX = [0.05 ,
0.1 ,
0.15000000000000002 ,
0.2 ,
0.25 ,
0.30000000000000004 ,
0.35000000000000003 ,
0.4 ,
0.45 ,
0.5 ,
0.55 ,
0.6000000000000001 ,
0.65 ,
0.7000000000000001 ,
0.75 ,
0.8 ,
0.8500000000000001 ,
0.9 ,
0.9500000000000001 ,
1.0 ]

oY1 = [2.302588469032184 ,
2.302638678216189 ,
2.302791857481596 ,
2.303055985047565 ,
2.3034455133160163 ,
2.303983408305429 ,
2.304704752177307 ,
2.30566306162952 ,
2.306941711028906 ,
2.308675727136845 ,
2.311096626208993 ,
2.3146345129193575 ,
2.320185505045508 ,
2.329971810302939 ,
2.3514233698804583 ,
2.4339567980618853 ,
1.9501171129320132 ,
2.2149755290716815 ,
2.248574790313648 ,
2.261656447015457]

oY2 = [2.1518263016746437 ,
2.292202658780094 ,
2.4198801892121797 ,
2.5338482845690637 ,
2.6333593158228834 ,
2.717959345873653 ,
2.787528235206554 ,
2.8423352460034197 ,
2.8831214252566078 ,
2.9112307270818762 ,
2.9288360448728463 ,
2.939368191384773 ,
2.9484422767097875 ,
2.966297428201235 ,
3.0172108006898744 ,
3.214224781823093 ,
3.249866206813253 ,
3.1649321044435164 ,
3.002896533120906 ,
2.7794652898412173]


plt.plot(oX, oY1, color='green', marker='o', linestyle='solid')
plt.plot(oX, oY2, color='red', marker='o', linestyle='solid')

plt.show()

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vladimir, 2020-09-29
@AstraVlad

1. Slight differences in values ​​may be due to float, in financial analytics, for example, I try not to use it at all, because even with operations with small numbers, some tails of hundred-thousandths can come out, and quite suddenly.
Here is an example and an explanation of such problems
. But this may not be the case, of course, in this case.
2. Do you mean list.append()? You don't have arrays here, but lists. I correctly understood that it is necessary to store in the list the values ​​that are obtained in the "while i < N:" loop?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question