Saya memiliki beberapa titik dan kurva yang digambarkan sebagai dua daftar termasuk posisi. Saya mencoba untuk mendapatkan daftar perbedaan antara titik dan kurva. Saya mencoba mengikuti web, tapi saya tidak mengerti perintah:

X = fmin_cobyla(objective, x0=[0.5,0.5], cons=[c1])

Apa argumen yang benar dalam kasus saya, tolong?

import numpy as np  
import matplotlib.pyplot as plt
from scipy.optimize import fmin_cobyla

data = np.loadtxt('O_Cout.dat', unpack=True, usecols=[0, 2])

z_1v1 = np.polyfit(data[0], data[1], 2)
f_1v1 = np.poly1d(z_1v1)
# Creating more points on the streamline - defining new time with more steps
x_new = list(np.arange(0,100000,1))
y_new = f_1v1(x_new)

# Plot figure with size
fig, ax = plt.subplots()

ax.scatter(data[0], data[1])

ax.plot(x_new, y_new)


def objective(X):
    x,y = X
    return np.sqrt((x - P[0])**2 + (y - P[1])**2)

def c1(X):
    x,y = X
    return f(x) - y


for i in range(len(data[1])-1):
    P = (data[0][i], data[1][i])
    print(P)

    X = fmin_cobyla(objective, x0=[0.5,0.5], cons=[c1])

    print ('The minimum distance is', objective(X))


# Save the figure
plt.tight_layout()
plt.savefig('OC_parabola.png')
-1
Elena Greg 11 Mei 2021, 19:33

1 menjawab

Jawaban Terbaik

Skrip yang Anda temukan dimaksudkan untuk fungsi yang diketahui f(x) tetapi IIUC Anda tidak tahu f(x): kurva Anda hanya ditentukan oleh koordinat (x,y) dan Anda tidak tahu f(x) jadi bahwa y=f(x).

Dalam hal ini, Anda dapat menggunakan dasar-dasar yang sama.

Diberikan titik P

enter image description here

Dan kurva yang ditentukan oleh koordinat (x,y), jarak antara titik P dan titik kurva dapat secara sederhana ditentukan oleh

enter image description here

Yang ingin kita perkecil, yaitu menemukan minimum/a dalam domain yang ditentukan.

Sebagai contoh

import numpy as np  
import matplotlib.pyplot as plt

# Here I define a function f(x) to
# generate y coordinates, but let us
# suppose we don't know it and that
# we got only x and y
def f(x):
    return np.cbrt( np.exp(2*x) -1 )

# This is what we really got
x = np.linspace(-2, 2, 1000)
y = f(x)

# The point P
P = (.5, .5)

fig, ax = plt.subplots(figsize=(7, 7))
ax.plot(x, y, lw=4)
ax.plot(*P, 'or')
ax.text(
    P[0], P[1], 
    f"  P ({P[0]}, {P[1]})", 
    ha='left', va='center',
    fontsize=15
)
ax.set(
    xlim=(-2, 2),
    ylim=(-2, 2),
)
plt.show()

enter image description here

Mari kita definisikan fungsi d, jarak antara titik P dan kurva

def distance(x, y, x0, y0):
    d_x = x - x0
    d_y = y - y0
    dis = np.sqrt( d_x**2 + d_y**2 )
    return dis

Dan sekarang hitung d antara P yang diberikan dan (x,y) dan temukan minimum

from scipy.signal import argrelmin

# compute distance
dis = distance(x, y, P[0], P[1])
# find the minima
min_idxs = argrelmin(dis)[0]
# take the minimum
glob_min_idx = min_idxs[np.argmin(dis[min_idxs])]
# coordinates and distance
min_x = x[glob_min_idx]
min_y = y[glob_min_idx]
min_d = dis[glob_min_idx]

Dan hasil plot

fig, ax = plt.subplots(figsize=(7, 7))

ax.plot(x, y, lw=4)
ax.plot(
    [P[0], min_x],
    [P[1], min_y],
    'k--', lw=1,
    label=f'distance {min_d:.2f}'
)
ax.plot(*P, 'or')
ax.text(
    P[0], P[1], 
    f"  P ({P[0]}, {P[1]})", 
    ha='left', va='center',
    fontsize=15
)
ax.set(
    xlim=(-2, 2),
    ylim=(-2, 2),
)
ax.legend()
plt.show()

enter image description here

2
Max Pierini 12 Mei 2021, 06:20