54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
import csv
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
from scipy.stats import linregress
|
|
|
|
r2max = 0.2
|
|
# Specify the path to your CSV file
|
|
csv_file_path = 'test-data/500-0.1.csv'
|
|
custom_delimiter = "\t"
|
|
|
|
# Read the CSV file and convert numbers from strings with commas to floats
|
|
with open(csv_file_path, 'r') as file:
|
|
# Create a CSV reader object with the specified delimiter
|
|
csv_reader = csv.reader(file, delimiter=custom_delimiter)
|
|
|
|
# Convert numbers from strings with commas to floats
|
|
data = np.array([[float(cell.replace(',', '.')) for cell in row] for row in csv_reader])
|
|
|
|
# Treat stress and strain values to be positive
|
|
data[:, 0] = np.abs(data[:, 0])
|
|
data[:, 1] = np.abs(data[:, 1])
|
|
|
|
|
|
# Use linregress to perform linear regression
|
|
elasticMax = 10
|
|
r_value = 0
|
|
|
|
while r_value < r2max and len(data[:, 0]):
|
|
slope, intercept, r_value, p_value, std_err = linregress(data[:elasticMax, 0], data[:elasticMax, 1])
|
|
print(r_value)
|
|
elasticMax += 10
|
|
|
|
|
|
|
|
# Create the fitted line using the slope and intercept
|
|
fitted_line = slope * data[:, 0] + intercept
|
|
|
|
|
|
# Plot data
|
|
x_values = data[:, 0]
|
|
y_values = data[:, 1]
|
|
|
|
|
|
|
|
plt.plot(data[:, 0], data[:, 1], label='Orignial data', color='blue')
|
|
plt.plot(data[:, 0], fitted_line, label='Fitted Line', color='red')
|
|
|
|
# Add labels and legend
|
|
plt.xlabel('Stress')
|
|
plt.ylabel('Strain')
|
|
plt.legend()
|
|
|
|
# Show the plot
|
|
plt.show()
|