import React, { useState, useMemo, useEffect } from 'react'; import { ComposedChart, Scatter, Line, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'; import { Calculator, FileText, Plus, Trash2, RefreshCw, Printer, Settings2 } from 'lucide-react'; export default function PhotoelectricExperiment() { // 1. 상태 관리 (State) const [data, setData] = useState([ { id: 1, x: 10, y: 105 }, { id: 2, x: 15, y: 45 }, { id: 3, x: 20, y: 24 }, { id: 4, x: 25, y: 17 }, { id: 5, x: 30, y: 11 }, ]); const [graphType, setGraphType] = useState('scatter'); // 'scatter', 'line', 'bar' const [showTheory, setShowTheory] = useState(true); // 2. 데이터 제어 함수 const handleDataChange = (id, field, value) => { setData(data.map(d => d.id === id ? { ...d, [field]: Number(value) } : d)); }; const addRow = () => { const newId = data.length > 0 ? Math.max(...data.map(d => d.id)) + 1 : 1; const lastX = data.length > 0 ? Math.max(...data.map(d => d.x)) + 5 : 10; setData([...data, { id: newId, x: lastX, y: 0 }]); }; const removeRow = (id) => { setData(data.filter(d => d.id !== id)); }; // 노이즈가 섞인 가상의 실험 데이터 생성 함수 const loadRandomData = () => { const distances = [5, 10, 15, 20, 25, 30, 35, 40]; const k = 10000; // 가상의 비례 상수 const newData = distances.map((d, i) => { // 이론값에 ±10% 의 무작위 실험 오차 추가 const noise = 0.9 + Math.random() * 0.2; const yValue = (k / (d * d)) * noise; return { id: i + 1, x: d, y: Number(yValue.toFixed(1)) }; }); setData(newData); }; // PDF 보고서 인쇄 호출 const handlePrint = () => { window.print(); }; // 3. 물리 및 통계 연산 (오차 분석 및 이론값 도출) // 이론: 광전류(i) = k / 거리(d)^2 // 따라서 k = i * d^2. 측정된 모든 데이터에서 k값을 구하고 평균을 내어 기준 상수로 사용. const analysis = useMemo(() => { if (data.length === 0) return { k: 0, processedData: [], avgError: 0 }; let sumK = 0; let validCount = 0; // 비례 상수 K 계산 data.forEach(d => { if (d.x > 0 && d.y > 0) { sumK += d.y * (d.x * d.x); validCount++; } }); const avgK = validCount > 0 ? sumK / validCount : 0; let totalError = 0; let errorCount = 0; // 처리된 데이터 및 각 포인트별 오차율 계산 const processedData = [...data] .sort((a, b) => a.x - b.x) // X축 정렬 (Line 그래프 시각화 오류 방지) .map(d => { const theory = d.x > 0 ? (avgK / (d.x * d.x)) : 0; const error = theory > 0 ? (Math.abs(d.y - theory) / theory) * 100 : 0; if (theory > 0) { totalError += error; errorCount++; } return { ...d, theory: Number(theory.toFixed(1)), error: Number(error.toFixed(2)) }; }); const avgError = errorCount > 0 ? totalError / errorCount : 0; return { k: avgK, processedData, avgError }; }, [data]); // 커스텀 툴팁 const CustomTooltip = ({ active, payload, label }) => { if (active && payload && payload.length) { return (
{`거리: ${label} cm`}
{`측정값: ${payload[0]?.value} μA`}
{payload[1] &&{`이론값: ${payload[1]?.value} μA`}
}역제곱 법칙 (Inverse Square Law) 검증 및 오차 분석
| 거리(cm) | 측정값(μA) | 이론값(μA) | 오차율(%) |
|---|---|---|---|
| {row.x} | {row.y} | {row.theory} | {row.error}% |
도출된 비례 상수 (K)
{analysis.k.toLocaleString(undefined, { maximumFractionDigits: 1 })}
※ 광전류 = K / 거리² 모델에 피팅된 상수입니다.
평균 오차율 (Mean Error)
{analysis.avgError.toFixed(2)} %
■ 종합 결론
{analysis.avgError < 10 ? (평균 오차율이 10% 미만으로 도출되었습니다. 이는 빛의 세기가 거리의 제곱에 반비례한다는 역제곱 법칙(Inverse Square Law)을 매우 잘 만족함을 보여줍니다. 광전효과 실험을 성공적으로 수행하였습니다.
) : (오차율이 다소 존재합니다. 이는 백열등이 완벽한 점광원(Point Source)이 아니거나, 주변 암막 상태 및 빛의 반사, 필터의 투과율 등의 외부 요인으로 인한 계통 오차일 수 있습니다.
)}본 보고서는 [백열등 광전류 측정 분석기] 웹 애플리케이션에 의해 자동 생성되었습니다.