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`}

}
); } return null; }; return ( <> {/* 인쇄(PDF) 전용 스타일링 설정 */}
{/* ========================================= 좌측: 제어 패널 (데이터 입력 및 설정) (인쇄 시 숨김 처리됨: no-print) ========================================= */}
{/* 데이터 입력 섹션 */}

데이터 입력

거리 (cm)
광전류 (μA)
{data.map((row) => (
handleDataChange(row.id, 'x', e.target.value)} className="w-full border rounded-md p-2 text-center focus:ring-2 focus:ring-blue-500 focus:outline-none" />
handleDataChange(row.id, 'y', e.target.value)} className="w-full border rounded-md p-2 text-center focus:ring-2 focus:ring-blue-500 focus:outline-none" />
))}
{/* 그래프 및 보고서 설정 섹션 */}

그래프 및 보고서 설정

setShowTheory(e.target.checked)} className="w-4 h-4 text-red-600 rounded border-red-300 focus:ring-red-500" />
{/* ========================================= 우측: 결과 및 보고서 패널 (인쇄 시 전체 화면을 채우도록 동작) ========================================= */}
{/* 보고서 헤더 */}

백열등의 광전류 측정 실험

역제곱 법칙 (Inverse Square Law) 검증 및 오차 분석

{/* 그래프 영역 */}

실험 결과 그래프

} /> {/* 실제 측정 데이터 그래프 */} {graphType === 'scatter' && } {graphType === 'line' && } {graphType === 'bar' && } {/* 이론값 곡선 */} {showTheory && ( )}
{/* 오차 분석 및 데이터 표 영역 */}
{/* 데이터 테이블 */}

측정 및 분석 데이터

{analysis.processedData.map((row, idx) => ( ))}
거리(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)이 아니거나, 주변 암막 상태 및 빛의 반사, 필터의 투과율 등의 외부 요인으로 인한 계통 오차일 수 있습니다.

)}
{/* 인쇄용 워터마크/하단 영역 */}

본 보고서는 [백열등 광전류 측정 분석기] 웹 애플리케이션에 의해 자동 생성되었습니다.

); }